在golang中,我们可以像C语言一样创建一个数组,也可以创建一个动态数组(slice)
数组:
a := [2]int{1, 2} a[0]=3 a[1]=4
此时我们创建了一个包含2个元素的数组,[]中只能是常量,因为数组在创建的时候必须是确定的。
切片:
make
通过阅读源码,slice的数据结构是这样的
type slice struct { array unsafe.Pointer len int cap int }
这是一个典型的结构体,其中第一个字段就是数组,类型是unsafe.Pointer。在此题外话一下,简单介绍下unsafe.Pointer。
此类型和C语言中常用的void*有点像,可以通过unsafe.Pointer和其它任意类型的指针相互转换,因为在golang中不同的类型之间是不能随意转换的,必须要有中间的unsafe.Pointer作为过渡,例如
var a int = 1 var b *uint64 = (*uint64)((unsafe.Pointer)(&a))
否则就会报错,类型转换失败。好了,到目前为止我们知道了这个array的类型其实就是一个指针类型,和C语言其实类似。
让人迷惑的操作