关于删除slice中间元素的问题

来源:3-3 切片的操作

爱吃apple的阿狸

2020-07-22

根据老师的讲解,新建s1 slice 有5个元素, 新建s2 初始长度为16的slice
在copy之前我往s2里append了一个元素10

s1 := []int{2, 4, 6, 8, 10}
s2 := make([]int, 16)
s2 = append(s2, 10) 

// 此时 s2 结果为 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10] len=17, cap=32

//再复制s1到s2里 
copy(s2, s1)

//此时结果为 [2 4 6 8 10 0 0 0 0 0 0 0 0 0 0 0 10] len=17, cap=32

后面删除s2[4]元素10,

s2 = append(s2[:4], s2[5:]...)
	printSlice(s2) 

//结果为 [2 4 6 8 0 0 0 0 0 0 0 0 0 0 0 10] len=16, cap=32

以上都没啥问题,但是,当我 使用 s2[:32] 想扩展slice到32的时候

printSlice(s2[:32])

结果 [2 4 6 8 0 0 0 0 0 0 0 0 0 0 0 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] len=32, cap=32

怎么在中间多了一个10 ??!不应该后面cap都是0么? 难道删除中间元素有啥操作??望老师解答~

写回答

1回答

爱吃apple的阿狸

提问者

2020-07-26

明白了~删除中间元素,是拼接前后slice,后面的那部分通过apend覆盖了元素,然后修改长度len,所以最后那个10,是之前剩下的。

1
0

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

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

5995 学习 · 1909 问题

查看课程