slice的append操作注意事项

Cedrus ·
同意楼上 `所以当函数里面有append,千万别把slice作为引用类型的参数用了!` go里面没有引用,什么情况下都不应该当作引用用吧 `在没扩容的情况下,传入slice_a的数据改变是会影响函数外的slice_a的值的,因为他们的byte*指向同一个地址。 扩容的情况下就没有这个影响了。` 这个说的不准确: package main import ( "fmt" ) func add(s1 []int, i int) { //s1和s0描述的是同一个slice,并且是值传递 s1[0] = 10 //这里也会改变s0 s2 := append(s1, i) //这里不管是否扩容都不会改变s0和s1,s2是一个不同于s0和s1的新的slice对象 s2[0] = 20 //只有在上一步append不扩容的情况下这里的修改才会影响到s0和s1 fmt.Printf("s1: %v, %p\n", s1, &s1) fmt.Printf("s2: %v, %p\n", s2, &s2) } func main(){ s0 := make([]int, 1, 5) fmt.Printf("s0: %v, %p\n", s0, &s0) add(s0, 1) fmt.Printf("s0: %v, %p\n", s0, &s0) }
#4