数据结构
type slice struct {
array unsafe.Pointer
len int
cap int
}
Pointer 是指向一个数组的指针,len 代表当前切片的长度,cap 是当前切片的容量。cap 总是大于等于 len 的。
扩容
当我们对slice进行append操作时,若len + 追加元素个数 <= cap时,不会发生内存扩张;否则,新的内存被申请,同时旧的数据被拷贝至新内存的前部;如果切片的容量小于 1024 个元素,于是扩容的时候就翻倍增加容量。上面那个例子也验证了这一情况,总容量从原来的4个翻倍到现在的8个。一旦元素个数超过 1024 个元素,那么增长因子就变成 1.25 ,即每次增加原来容量的四分之一。
nil切片和空切片
var a []int //nil切片
b:=make([]int,0) //空切片
c := make([]int,0)//空切片
d := []int{}//空切片
空切片的底层数组为空,但底层数组指针非空
range 切片
range循环遍历切片,拿到的 Value 其实是切片里面的值拷贝
array := []int{10, 20, 30, 40}
for key, item := range array {
fmt.Println(&array[key])
fmt.Println(&item)
}
输出结果为:
0xc000014240
0xc0000180a0
0xc000014248
0xc0000180a0
0xc000014250
0xc0000180a0
0xc000014258
0xc0000180a0