彬哥笔记 --17 Go语言 游戏服务器slice使用

栏目: Go · 发布时间: 7年前

内容简介:大家好,我是彬哥,本节给大家讲下go语言服务器游戏slice处理相关,抛砖引玉了,主要是针对Go语言游戏服务器开发slice使用。先给大家看了小demo,LollipopGo框架版本v1.0.20190104 ,斗兽棋初始化棋盘demo代码如下:大家说 以下截图 打印的数据 是否相同:

大家好,我是彬哥,本节给大家讲下 go 语言服务器游戏slice处理相关,抛砖引玉了,主要是针对Go语言游戏服务器开发slice使用。

首先

先给大家看了小demo,LollipopGo框架版本v1.0.20190104 ,斗兽棋初始化棋盘demo代码如下:

package main

import (
    "LollipopGo/LollipopGo/util"
    "Proto/Proto2"
    _ "binge/db"
    "fmt"
)

var DSQ_qinei = []int{ // 1-8 A ;9-16 B ; 17 未翻牌; 18 已翻牌
    Proto2.Elephant, Proto2.Lion, Proto2.Tiger, Proto2.Leopard, Proto2.Wolf, Proto2.Dog, Proto2.Cat, Proto2.Mouse,
    Proto2.Mouse + Proto2.Elephant, Proto2.Mouse + Proto2.Lion, Proto2.Mouse + Proto2.Tiger, Proto2.Mouse + Proto2.Leopard,
    Proto2.Mouse + Proto2.Wolf, Proto2.Mouse + Proto2.Dog, Proto2.Mouse + Proto2.Cat, 2 * Proto2.Mouse}

// 初始化牌型
func InitDSQ(data1 []int) [4][4]int {

    data, erdata, j, k := data1, [4][4]int{}, 0, 0

    for i := 0; i < Proto2.Mouse*2; i++ {
        icount := util.RandInterval_LollipopGo(0, int32(len(data))-1)
        fmt.Println("随机数:", icount)
        if len(data) == 1 {
            erdata[3][3] = data[0]
        } else {
            //------------------------------------------------------------------
            if int(icount) < len(data) {
                erdata[j][k] = data[icount]
                k++
                if k%4 == 0 {
                    j++
                    k = 0
                }
                data = append(data[:icount], data[icount+1:]...)
            } else {
                erdata[j][k] = data[icount]
                k++
                if k%4 == 0 {
                    j++
                    k = 0
                }
                data = data[:icount-1]
            }
            //------------------------------------------------------------------
        }
        fmt.Println("生成的数据", erdata)
    }

    return erdata
}

func main() {
    fmt.Println("DSQ_qinei ", DSQ_qinei)
    InitDSQ(DSQ_qinei)
    fmt.Println("DSQ_qinei ", DSQ_qinei)
}

大家说 以下截图 打印的数据 是否相同:

彬哥笔记 --17 Go语言 游戏服务器slice使用

代码截图

运行结果:

彬哥笔记 --17 Go语言 游戏服务器slice使用

运行结果

运行结果发现定义的DSQ_qinei数据全部变化了,这是为什么?

大家知道Go语言中引用类型都有什么吗?还有slice底层是如何实现的?

分析

1、值类型和引用类型

值类型:int、float、bool和string这些类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中。当使用等号=将一个变量的值赋给另一个变量时,如 j = i ,实际上是在内存中将 i 的值进行了拷贝。可以通过 &i 获取变量 i 的内存地址。 值拷贝

引用类型:特指slice、map、channel这三种预定义类型。引用类型拥有更复杂的存储结构:(1)分配内存 (2)初始化一系列属性等一个引用类型的变量r1存储的是r1的值所在的内存地址(数字),或内存地址中第一个字所在的位置,这个内存地址被称之为指针,这个指针实际上也被存在另外的某一个字中。

两者的主要区别:拷贝操作和函数传参。

2、实例详解值类型和引用类型

数组array和切片slice的实例:

定义了一个数组a,它是值类型,复制给b是copy,当b发生变化后a并不会发生任何变化,程序的执行结果如下所示:

//由 main 函数作为程序入口点启动

func main() {

a :=[5]int{1,2,3,4,5}

b := a

b[2] = 8

fmt.Println(a, b)

}

彬哥笔记 --17 Go语言 游戏服务器slice使用

image.png

切片则不然,如下代码所示:

//由 main 函数作为程序入口点启动

func main() {

a :=[]int{1,2,3,4,5}

b := a

b[2] = 8

fmt.Println(a, b)

}

程序输出结果:a和b本质上指向同一个底层数组。 切片的底层数据结构其实是一个指针、len、cap。

彬哥笔记 --17 Go语言 游戏服务器slice使用

image.png

总结

大家在开发过程中,特别是刚刚接触go语言的同学,不要觉得go语言简单就直接上手做项目;一定要把基础打牢,否则在项目中遇到的基础问题都会让你花费很多时间,记住一句话:万变不离其宗,基础打牢!

每天坚持学习1小时Go语言,大家加油,我是彬哥,下期见!如果文章中不同观点、意见请文章下留言或者关注下方订阅号反馈!

社区交流群:221273219

Golang语言社区论坛 :

www.Golang.Ltd

LollipopGo游戏服务器地址:

https://github.com/Golangltd/LollipopGo

社区视频课程课件GIT地址:

https://github.com/Golangltd/codeclass
彬哥笔记 --17 Go语言 游戏服务器slice使用

Golang语言社区


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Science of Programming

The Science of Programming

David Gries / Springer / 1989-4-21 / USD 99.00

Describes basic programming principles and their step-by- step applications.Numerous examples are included.一起来看看 《The Science of Programming》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具