golang学习之slice

1.slice本质

pointer + len + cap

pointer 指向一段真实数组

len 从起始地址指向元素开始的数量
cap 此数组的容量(append时,容量不够会自动扩容)

2.slice的有趣实验

 1 func main() {
 2     var array []int32 = []int32{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
 3     var slice = array[0:10]
 4     fmt.Println("原始array[0]:", array[0])
 5     slice[0] = 2
 6     fmt.Println("新的array[0]:", array[0])
 7     slice = append(slice, 11)
 8     //fmt.Println("新的array[10]:", array[10])
 9     slice[0] = 3
10     fmt.Println("新的array[0]:", array[0])
11     fmt.Println("新的slice[0]:", slice[0])
12 }

输出结果:

 前两个输出,修改slice的值,原始的也被修改,表明slice的本质是一个指针

后两个输出,修改slice的值,原始的没有再被修改,因为slice的cap不够,会自动扩容(实验尝试发现扩容一般为原cap的两倍,且是4的倍数)

  扩容后slice是一个新的地址,跟原来的就不相关了。

猜你喜欢

转载自www.cnblogs.com/ayaoyao/p/11442529.html