切片副本改变原始切片

Say*_*me. 0 go slice

有人可以帮助解释 Golang 内部为什么这段代码会改变原始数组a吗?

func main() {
    a := []int{1,2,3,4}
    b := a
    b = append(b[0:1], b[2:]...)
    fmt.Println(b)
    fmt.Println(a)
}
Run Code Online (Sandbox Code Playgroud)

输出:

[1 3 4]
[1 3 4 4]
Run Code Online (Sandbox Code Playgroud)

我以为b := a会按值传递。提前致谢。

rus*_*tyx 5

这就是切片的工作原理。切片只是一个指针(+大小+容量),实际数据存储在数组中。

当您复制切片时,不会复制底层数组。然后你最终会得到两个指向同一个数组的切片。改变一个切片的值将通过另一切片可见。

有关更多详细信息,请参阅Go 切片:用法和内部结构

如果您想保持原始切片不变,请先进行深度复制。例如像这样

    b := append([]int{}, a...)  // deep copy
Run Code Online (Sandbox Code Playgroud)

现场演示