起初是看了这篇文章 我为什么放弃Go语言,里面关于sclice切片的内容我也是只知道的现象,而不清楚原理,这次就好好总结一下吧~
前置知识:
- 当 append 超过 cap 大小的时候,slice 会自动帮我们扩容,在元素数量小于 1024 的时候每次会扩大一倍,当超过了 1024 个元素每次扩大 25%。
- slice的底层就是数组。
现象
当在slice中插入,会有什么现象,对原数组有影响么?
不超容量
var a = [3]int{}
b := a[1:2]
b = append(b, 1)
最后结果
a: [0 0 1] b: [0 1] 其实就是直接修改了第3个值,并没有发生扩容,那么,我们就接着遇到扩容的情况!
超容量,发生扩容
var a = [3]int{}
b := a[1:2]
b = append(b, 1, 2)
最后结果
a: [0 0 0] b :[0 1 2] 当slice进行append时,超出容量就直接复制原来的内容,成了一个有新底层数组的slice,不信?那么追加操作,改b[0] = -1试试,得到最后结果:a: [0 0 0] b: [-1 1 2]
对原数组进行扩容,看看会不会有什么大病
少年,原数组是不能扩容的,只有slice才可以扩容。
总结: 如果在切片上修改的话(包括append),不超容量,在切片上修片的结果会同步到数组上,但是扩容后,就和原数组没关系喽。