请教一个go切片引用的问题

var arr2d [][]int
arr := []int{1, 2}
arr2d = append(arr2d, arr) //[[1,2]]
arr = arr[:len(arr) -1 ] //arr = [1]
arr = append(arr, 3)     //arr = [1,3]
fmt.Println(arr2d)       //[[1,3]]

我的理解是arr是一个切片,对arr做出改变会影响到arr2d的值
在看另一段代码

var arr2d [][]int
arr := []int{1, 2}
arr2d = append(arr2d, arr) //[1,2]
arr = append(arr, 3)     //arr = [1,2,3]
fmt.Println(arr2d)       //[[1,2]]

这里的arr = append(arr, 3)操作为什么没影响到arr2d的值呢?

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 2

reslice 后会返回新的指针,没有扩容的情况下才会修改同一个slice

2年前 评论

理解了,若 append 追加完之后没有突破 slice 的容量,则实际上追加的数据改变了其底层数组对应的值,并且 append 函数返回对底层数组新的引用(切片);若 append 追加的数据量突破了 slice 的最大容量(底层数组长度固定,无法增加长度赋予新值),则 Go 会在内存中申请新的数组(数组内的值为追加操作之后的值),并返回对新数组的引用(切片)。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!