slice删除元素后,原slice的值的变化

来源:3-3 切片的操作

tangmm729

2018-02-08



s这个slice为什么会是那样的

写回答

3回答

smilerr

2018-02-08

图片加载失败
为了更好的理解给你画了一个图,不管是S[:3]还是S[:4]底层对应的都是S,只不过在append(s[:3],s[4:]...)的时候对应的把s[4:]追加到s[:3]后面,所以才会导致把4后面的数值往前移动了一位得到Sn,但是Sn底层也是s,所以才会出现你的那种情形

2
0

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的底层数组将不再是同一个数组。


验证:

同上

2
0

smilerr

2018-02-09

图片加载失败
图片被自动裁剪了,这张用于设补全

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程