slice的append操作注意事项

Cedrus ·
更多评论
文章中举的例子太绕了,而且说得不是很清楚,我觉得关键的原因在于: 当使用slice作为函数参数时,由于go的函数参数是值传递方式,所以会复制整个slice结构体,即 struct Slice { // must not move anything byte* array; // actual data uintgo len; // number of elements uintgo cap; // allocated number of elements }; 假设参数叫slice1 被复制的临时值叫slice2 结构体被复制后,在函数内部 可以通过slice2修改其指向的array(slice1也指向这个array),但是当进行append时,由于len和cap是值传递,所以函数外的slice1的len和cap不会被修改。slice1自然也就不会有任何更改。至于为什么在中间进行append时 slice1就被修改了 其实是因为append修改底层引用的array,所以slice1看上去被修改了,(其实是引用的底层array被修改)
#3