append方法操作slice改变底层数组中的元素问题(在不超过capacity的情况下)

来源:3-3 切片的操作

aibo

2018-08-01

老师,您好,下面是我在看了您3-3切片操作章节课程后对append方法的理解,主要想问一下第3条中我的理解是不是正确(其他两条我自己觉得应该没太打问题);非常感谢老师您在课程中深入浅出的讲解!

其实会又这个问题,也是在看了另外一个同学(tangmm729)的问题后(https://coding.imooc.com/learn/questiondetail/42390.html),产生的疑惑,然后我自己画图和验证得出第三条~感觉问题应该不大,还是想向老师您确认一下...

1.  因为每次append时,slice内部的结构会改变(会改变length;可能改变capacity分配新的内存中的底层数组从而改变ptr),所以需要变量来接返回值(go语言永远是值传递)
2. 添加元素时,如果没有超出slice的capacity,则直接在slice后加上这个(组)元素,并改变视图下标对应底层数组位置的元素;如果超出,则在内存中创建一个新的长度的底层数组,slice会view这个新的底层数组;原来的数组如果不再使用,go会通过垃圾回收机制把它删除

3.在通过append给slice删除元素时,需要注意slice的ptr,这是视图的起始位置;通过append重新组合slice后,append方法的操作也改变了视图对应下标中底层数组中的元素(其他位置的元素保持不变)


//img.mukewang.com/szimg/5b6144c800013ad610801440.jpg


写回答

2回答

慕标3951566

2018-08-02

哦哦,理解错了,使用append删除,组合要删除元素前后的两端slice,我理解是会改变底层数组元素的值,除非底层数组cap不够,导致重新开辟的新的底层数组,那原底层数组值就没改变,只是删除的话cap的值总是够的,原数组的值就会改变

1
2
aibo
是的,是这个意思
2018-08-03
共2条回复

慕标3951566

2018-08-02

弱弱的问一下,append还可以删除?

0
0

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

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

5995 学习 · 1909 问题

查看课程