append to a new slice affect original slice
我有下面的代码,这会导致一个奇怪的结果。我不明白为什么:
1 2 3 4 5 6 7 8 9 10 | func main() { var s = []int{2, 3} var s1 = append(s, 4) var a = append(s1, 5) var b = append(s1, 6) fmt.Println(s) fmt.Println(s1) fmt.Println(a) fmt.Println(b) } |
这将导致:
1 2 3 4 | [2 3] [2 3 4] [2 3 4 6] [2 3 4 6] |
我的问题是:为什么A不是[2 3 4 5]而是[2 3 4 6]?我知道附加到b的更改a,但是如何更改。这是一个bug吗?因为我从未直接更改过,显然我不希望发生这种情况?
请记住,切片是由3个字段组成的结构。
- 指向基础数组的指针
- 切片长度
- 切片容量
根据输入的大小和容量,append()函数可以就地修改其参数,也可以返回带有附加项的参数副本。函数的作用是:如果切片的长度大于切片所指向的数组的长度,则创建一个新的切片。