GO语言的数组和C语言的数组是一样的,都是分配一片连续地内存,内存地起始地址和数组地第一个元素的地址,大小为每个元素的大小成语元素的个数。数组一经初始化,大小和地址就不行更改了。
//go
var intArray = [6]int{1,2,3,4,5,6}
unsafe.Sizeof(intArray) //48
unsafe.Sizeof(intArray[0]) //8
等价于
//C++
int intArray[6] = {1,2,3,4,5,6};
sizeof(intArray) //24
sizeof(intArray[0]) //4
熟悉C++的同学估计会指出,数组的定义中的元素个数6是可以省略的。对于C/C++的确是这样的
//C++
int intArray[] = {1,2,3,4,5,6};
sizeof(intArray) //24
sizeof(intArray[0]) //4
但是如果是GO语言,就不行了
//go
var intArray = [0]int{1,2,3,4,5,6}
unsafe.Sizeof(intArray) //24
unsafe.Sizeof(intArray[0]) //8
此时你定义的是一个切片Slice。C/C++中是没有相关的概念的。go中的切片是固定大小都是24(x64),切片的行为基本和数组等价,可以通过下标或for循环访问其中的元素。切片可以从另一个切片或素组中创建出来
slice := arrary[begin:count]
begin代表起始的元素下标。count代表要截取的元素个数。实际上切片中包含了三个属性,一个是首元素的地址,一个是有效元素的个数,还有就是切片最大可以容纳元素的个数。所以切片可以看作是原本数组的一个引用,如果切片中的元素改变也会影响到原数组或切片。切片另外一个操作就是可以添加元素。
slice = append(slice, 1)
此时如果有效元素和最大容纳的元素个数相同,则append将重新分配内存,并将原来的切片或数据复制到新的内存中,并在后面加入一个新的元素1,如果有效元素小最大容纳的元素个数则直接在后面加以俄国元素1,并将有效元素个数加一。