使用append可以在slice之后追求元素,例如
nums:=[]int{
1,2,3}
result:=append(nums,4)
fmt.Println(result)
这段代码很简单,输出result的值为:[1 2 3 4]
问题在于,进行这种操作时,原来的slice(即nums)所基于的数组的值会不会发生变化呢?在Golang中,如果有多个slice基于了同一个数组,则这些slice的数据是共享的(而不是每个slice复制一份)。也就说,如果改变了数组的内容,则基于它的所有slice的值都会变化这段代码中nums的值没有变化,但是并非所有时候都是如此。
回答这个问题,首先需要了解append函数实现原理:
1. 如果nums的cap够用,则会直接在nums指向的数组后面追加元素,返回的slice和原来的slice是同一个对象。显然,这种情况下原来的slice的值会发生变化!
2. 如果nums的cap不够用(上述代码就是这种情况),则会重新分配一个数组空间用来存储数据,并且返回指向新数组的slice。这时候原来