slice包含三个成员:指向底层数组的指针,slice的长度,长度的容量
go中所有的函数传参都为值传递,当slice作为入参,并且对slice进行修改时,由于指向数组的指针指向同一个地址,对数组的修改会同步到函数外部的切片上;但是slice的长度和容量是两个值变量,函数内部对他们的修改无法传递到函数外,所以会造成函数内对slice进行append操作,底层数组发生了变化,但是函数外部slice因无法感知内部切片长度的变化,而没有修改的情况;另外,当slice的长度要超出slice的容量时,slice会进行扩容:申请一块新的地址作为底层数组,将旧的数组上的值拷贝过来,扩容完成后,函数内切片指向的数组与函数外切片指向的数组就不再是同一个地址,所有的修改都不会生效。
解决方案:将切片的指针作为参数传递进去
func append_test (arr *[]int) {
*arr = append(*arr, 555,555)
(*arr)[0] = 55 //注意这里的写法 (*arr)[] //*arr[] 会被编译器理解为*(arr[index])
}
append 和 copy函数:
copy() 将切片s的内容复制给切片s1,返回复制的元素数
若元素不够,则只拷贝一部分;
s和s1数据空间相互独立,相互不影响