追加到新切片会影响原始切片

时间:2018-12-01 16:17:13

标签: go slice

我有以下代码会导致奇怪的结果。我不明白为什么:

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)
}

这将导致:

[2 3]
[2 3 4]
[2 3 4 6]
[2 3 4 6]

我的问题是:为什么a不是[2 3 4 5]而是[2 3 4 6]?我知道追加到b会更改a,但是会如何。这是一个错误,因为我从未直接更改过,并且显然我不希望这种情况发生吗?

1 个答案:

答案 0 :(得分:1)

请记住,切片是3个字段的结构。

  • 指向基础数组的指针
  • 切片的长度
  • 切片的容量

append()函数可以就地修改其自变量,也可以返回其自变量的副本以及其他条目,具体取决于其输入的大小和容量。如果该切片的长度大于该切片所指向的数组的长度,则append()函数将创建一个新的切片。