大佬教程收集整理的这篇文章主要介绍了Go语言中的Array、Slice、Map和Set使用详解,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Array(数组)
内部机制
在 Go 语言中数组是固定长度的数据类型,它包含相同类型的连续的元素,这些元素可以是内建类型,像数字和字符串,也可以是结构类型,元素可以通过唯一的索引值访问,从 0 开始。
数组是很有价值的数据结构,因为它的内存分配是连续的,内存连续意味着可是让它在 cpu 缓存中待更久,所以迭代数组和移动元素都会非常迅速。
数组声明和初始化
通过指定数据类型和元素个数(数组长度)来声明数组。
一旦数组被声明了,那么它的数据类型跟长度都不能再被改变。如果你需要更多的元素,那么只能创建一个你想要长度的新的数组,然后把原有数组的元素拷贝过去。
Go 语言中任何变量被声明时,都会被默认初始化为各自类型对应的 0 值,数组当然也不例外。当一个数组被声明时,它里面包含的每个元素都会被初始化为 0 值。
一种快速创建和初始化数组的方法是使用数组字面值。数组字面值允许我们声明我们需要的元素个数并指定数据类型:
如果我们知道想要数组的长度,但是希望对指定位置元素初始化,可以这样:
使用数组
使用 [] 操作符来访问数组元素:
// 为索引为0和1的元素赋值
*array[0] = 7
*array[1] = 77
// 编译器会报错
Compiler Error:
cannot use array2 (type [5]string) as type [4]string in assignment
array1 = array2
// 赋值完成后,两组指针数组指向同一字符串
多维数组
数组总是一维的,但是可以组合成多维的。多维数组通常用于有父子关系的数据或者是坐标系数据:
// 使用数组字面值声明并初始化
array := [4][2]int{{10,11},{20,21},{30,31},{40,41}}
// 指定外部数组索引位置初始化
array := [4][2]int{1: {20,3: {40,41}}
// 同时指定内外部数组索引位置初始化
array := [4][2]int{1: {0: 20},3: {1: 41}}
同样通过 [] 操作符来访问数组元素:
array[0][0] = 0
array[0][1] = 1
array[1][0] = 2
array[1][1] = 3
也同样的相同类型的多维数组可以相互赋值:
array[0][0] = 0
array[0][1] = 1
array[1][0] = 2
array[1][1] = 3
array1 = array2
因为数组是值,我们可以拷贝单独的维:
在函数中传递数组
在函数中传递数组是非常昂贵的行为,因为在函数之间传递变量永远是传递值,所以如果变量是数组,那么意味着传递整个数组,即使它很大很大很大。。。
举个栗子,创建一个有百万元素的整形数组,在64位的机器上它需要8兆的内存空间,来看看我们声明它和传递它时发生了什么:
Go 语言当然不会这么傻,有更好的方法来在函数中传递数组,那就是传递指向数组的指针,这样每次只需要分配8字节内存:
但是注意如果你在函数中改变指针指向的值,那么原始数组的值也会被改变。幸运的是 slice(切片)可以帮我们处理好这些问题,来一起看看。
Slice(切片)
内部机制和基础
slice 是一种可以动态数组,可以按我们的希望增长和收缩。它的增长操作很容易使用,因为有内建的 append 方法。我们也可以通过 relice 操作化简 slice。因为 slice 的底层内存是连续分配的,所以 slice 的索引,迭代和垃圾回收性能都很好。
slice 是对底层数组的抽象和控制。它包含 Go 需要对底层数组管理的三种元数据,分别是:
1.指向底层数组的指针
2.slice 中元素的长度
3.slice 的容量(可供增长的最大值)
创建和初始化
第一个方法是使用内建的函数 make。当我们使用 make 创建时,一个选项是可以指定 slice 的长度:
如果只指定了长度,那么容量默认等于长度。我们可以分别指定长度和容量:
以上是大佬教程为你收集整理的Go语言中的Array、Slice、Map和Set使用详解全部内容,希望文章能够帮你解决Go语言中的Array、Slice、Map和Set使用详解所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。