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方法的操作也改变了视图对应下标中底层数组中的元素(其他位置的元素保持不变)
2回答
-
哦哦,理解错了,使用append删除,组合要删除元素前后的两端slice,我理解是会改变底层数组元素的值,除非底层数组cap不够,导致重新开辟的新的底层数组,那原底层数组值就没改变,只是删除的话cap的值总是够的,原数组的值就会改变
122018-08-03 -
慕标3951566
2018-08-02
弱弱的问一下,append还可以删除?
00
相似问题