切片复制突变的原始切片

有人可以帮助解释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


九州编程
浏览 172回答 2
2回答

哈士奇WWW

这就是切片的工作原理。切片只是一个指针(+大小+容量),实际数据存储在数组中。复制切片时,不会复制基础数组。然后,您最终会得到指向同一数组的两个切片。改变一个切片的值将通过另一个切片变得可见。有关更多详细信息,请参阅 Go 切片:用法和内部设置。如果要保持原始切片不变,请先进行深层复制。例如,像这样    b := append([]int{}, a...)  // deep copy(现场演示)

吃鸡游戏

切片基本上是数组的包装器。切片没有自己的数据,它们只保存对数组的引用。在给定的代码中,您分配给b现在它们都表示相同的数组。因此,当您使切片发生突变时,切片也会发生突变。aba可以使用 方法将元素从一个数组复制到另一个数组。copy// copy returns the count of total copied elementscount := 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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go