有人可以帮助解释 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会按值传递。提前致谢。
这就是切片的工作原理。切片只是一个指针(+大小+容量),实际数据存储在数组中。
当您复制切片时,不会复制底层数组。然后你最终会得到两个指向同一个数组的切片。改变一个切片的值将通过另一切片可见。
有关更多详细信息,请参阅Go 切片:用法和内部结构。
如果您想保持原始切片不变,请先进行深度复制。例如像这样
b := append([]int{}, a...) // deep copy
Run Code Online (Sandbox Code Playgroud)
(现场演示)
| 归档时间: |
|
| 查看次数: |
733 次 |
| 最近记录: |