关于go:附加到新切片影响原始切片

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()函数可以就地修改其参数,也可以返回带有附加项的参数副本。函数的作用是:如果切片的长度大于切片所指向的数组的长度,则创建一个新的切片。