首页 > 解决方案 > 附加到新切片影响原始切片

问题描述

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

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,但是如何。这是一个错误,因为我从未直接更改 a 并且显然我不希望这种情况发生吗?

标签: goslice

解决方案


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

  • 指向底层数组的指针
  • 切片的长度
  • 切片容量

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


推荐阅读