为了账号安全,请及时绑定邮箱和手机立即绑定

切片复制突变的原始切片

切片复制突变的原始切片

Go
九州编程 2022-09-26 17:40:41
有人可以帮助解释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

(现场演示)


查看完整回答
反对 回复 2022-09-26
?
吃鸡游戏

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)

}


查看完整回答
反对 回复 2022-09-26
  • 2 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号