下面有一段代码:
func main() {
appendSlice()
}
func appendSlice() {
arr := make([]int64, 0, 10)
for i := int64(0); i < 10; i++ {
if i%5 == 0 {
appendSlice2(arr, i) //在另外的函数APPEND 0和5
continue
}
arr = append(arr, i)
}
fmt.Printf("%v\n", arr) //结果是 [1 2 3 4 6 7 8 9] ,并没有0和5
fmt.Printf("arr len is %v", len(arr)) // 结果是8
}
可以发现在另一个函数对slice arr添加了元素0和5,但是最终打印的结果并没有0和5元素(注意,该数组本身已申请了10的capacity,所以并没有发生扩容导致指针地址发生变化的情况)。发生这现象的原因就是slice它是值传递,请看看它的结构体
array虽然是指针,但是在appendSlice2函数里面的确往指针所指向的数据添加了元素,即影响了外部的arr变量的实际数组,但是并没有影响外部变量arr的len数值。而append是往slice当前的len下标添加元素的,所以最后打印出来的结果,array元素没有0和5,因为它们都被覆盖了。
所以,一个好的编程习惯是,不要在嵌套的函数对slice进行append!
更多详情可以参考:juejin.cn/post/702699…