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

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

内容简介:大家好,我是彬哥,本节给大家讲下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语言社区


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

查看所有标签

猜你喜欢:

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

RESTful Web Services Cookbook中文版

RESTful Web Services Cookbook中文版

Subbu Allamaraju / 丁雪丰、常可 / 电子工业出版社 / 2011-9 / 59.00元

RESTful Web Services Cookbook中文版:REST最佳实践手册,ISBN:9787121143908,作者:(美)Subbu Allamaraju(沙布·阿拉马拉尤)著,丁雪丰,常可 译一起来看看 《RESTful Web Services Cookbook中文版》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具