Golang 切片修改相关的个人疑问及个人解答

143 阅读1分钟

起初是看了这篇文章 我为什么放弃Go语言,里面关于sclice切片的内容我也是只知道的现象,而不清楚原理,这次就好好总结一下吧~

前置知识:

  1. 当 append 超过 cap 大小的时候,slice 会自动帮我们扩容,在元素数量小于 1024 的时候每次会扩大一倍,当超过了 1024 个元素每次扩大 25%。
  2. 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),不超容量,在切片上修片的结果会同步到数组上,但是扩容后,就和原数组没关系喽。