slice删除元素后,原slice的值的变化
来源:3-3 切片的操作

tangmm729
2018-02-08
s这个slice为什么会是那样的
写回答
3回答
-
为了更好的理解给你画了一个图,不管是S[:3]还是S[:4]底层对应的都是S,只不过在append(s[:3],s[4:]...)的时候对应的把s[4:]追加到s[:3]后面,所以才会导致把4后面的数值往前移动了一位得到Sn,但是Sn底层也是s,所以才会出现你的那种情形20 -
champ
2018-03-12
我的理解是这样的:
s := make([]int, 9)
这句代码会在底层分配一个数组,长度为9,切片s是对这个数组的view,len(s) = cap(s) = 9
当执行
sn := append(s[:3], s[4:]...)
的时候,会把s[4:]...这些元素append到s[:3]这个切片对应的底层数组中,由于这个数组的容量足够存放这些数据(8 < 9),所以不会分配新的数组空间,而是直接使用s切片对应的底层数组。这样,sn和s这两个切片的底层数组是同一个数组。
验证:
在最后添加如下代码
sn[0] = 100 fmt.Printf("sn=%v, s=%v\n", sn, s)
思考:
如果append的元素个数超过s对应的底层数组容量,会发生什么呢?
比如执行
sn := append(s[:3], s[2:]...)
由于要把s[2:]...这些元素追加到s[:3]对应的底层数组上,由于s切片对应的数组容量不够(10>9),因此,会分配新的数组空间来存放这些数据,sn就是这个新分配的数组的view,而s对应的底层数组保持不变。此时,sn和s的底层数组将不再是同一个数组。
验证:
同上
20 -
smilerr
2018-02-09
图片被自动裁剪了,这张用于设补全00
相似问题