有人可以帮助解释Gorang内部为什么这个代码正在改变原始数组a吗?func main() { a := []int{1,2,3,4} b := a b = append(b[0:1], b[2:]...) fmt.Println(b) fmt.Println(a)}输出:[1 3 4][1 3 4 4]我以为会传递价值。提前致谢。b := a
2 回答
哈士奇WWW
TA贡献1799条经验 获得超6个赞
这就是切片的工作原理。切片只是一个指针(+大小+容量),实际数据存储在数组中。
复制切片时,不会复制基础数组。然后,您最终会得到指向同一数组的两个切片。改变一个切片的值将通过另一个切片变得可见。
有关更多详细信息,请参阅 Go 切片:用法和内部设置。
如果要保持原始切片不变,请先进行深层复制。例如,像这样
b := append([]int{}, a...) // deep copy(现场演示)
吃鸡游戏
TA贡献1829条经验 获得超7个赞
切片基本上是数组的包装器。切片没有自己的数据,它们只保存对数组的引用。在给定的代码中,您分配给b现在它们都表示相同的数组。因此,当您使切片发生突变时,切片也会发生突变。aba
可以使用 方法将元素从一个数组复制到另一个数组。copy
// copy returns the count of total copied elements
count := copy(b /*destination*/ , a /*source*/)
但请确保分配具有相同源数组长度的数组。示例如下:
func main() {
a := []int{1,2,3,4}
b := make([]int, len(a))
_ = copy(b, a)
a[0] = 2
fmt.Println(b)
fmt.Println(a)
}
- 2 回答
- 0 关注
- 171 浏览
添加回答
举报
0/150
提交
取消
