如何传递 [][]int 变量 [closed]

How to pass a [][]int variable [closed]

提问人:S.Ye 提问时间:2/2/2021 最后编辑:Jonathan HallS.Ye 更新时间:2/3/2021 访问量:73

问:


这个问题是由一个错别字或一个无法再重现的问题引起的。虽然类似的问题可能在这里成为主题,但这个问题的解决方式不太可能帮助未来的读者。

2年前关闭。

我们知道 Go 是按值传递的,切片是指针类型,那么 [][]int 呢? 我收到了这个代码

func add(nums [][]int) {
    nums = append(nums, []int{1,2,3})
}

在此功能之后,nums 似乎没有改变。我对 [][]int 感到困惑。

值传递

评论

3赞 icza 2/2/2021
[][]int只不过是一片.这样对待它。您必须返回结果并将其分配给原始切片。[]int
5赞 Adrian 2/2/2021
这里有两个重要的细节:首先,slice 不是指针类型;它包含指向基础数组的指针,但切片本身不是指针。这导致了第二个细节,返回新值的原因是,当它需要调整大小时,它必须创建一个新的后备数组,并且由于切片实际上不是指针,因此您需要取回包含指向新后备数组的指针的新切片。append
1赞 Zan Lynx 2/2/2021
永远记住,在 Go 中就像在 C 中一样。必须始终使用返回值。原来的切片在 之后就没用了。appendreallocappend
2赞 Zan Lynx 2/2/2021
哦,是的,赋值不会影响原始切片,因为它是切片的副本,是在调用函数时创建的。numnum

答:

1赞 Coconut 2/3/2021 #1

代码将值分配给名为 的局部变量。nums

由于 是不是引用的局部变量,因此无法从函数范围之外访问它。numsadd

如果要更改函数外部的值,它必须是指针类型。nums

您必须先取消引用它,然后分配要分配给它的值。

func add(nums *[][]int) {
    t := append(*nums, []int{1,2,3})
    *nums = &t
}