猿问

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

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


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


慕斯王
浏览 67回答 1
1回答

人到中年有点甜

请记住,切片是 3 个字段的结构。指向底层数组的指针切片的长度切片的容量append() 函数可以就地修改其参数或返回其参数的副本和一个附加条目,具体取决于其输入的大小和容量。append() 函数创建一个新的切片,如果切片的长度大于切片指向的数组的长度。
随时随地看视频慕课网APP

相关分类

Go
我要回答