【问题标题】:How to pass a [][]int variable [closed]如何传递 [][]int 变量 [关闭]
【发布时间】:2021-05-06 19:15:35
【问题描述】:

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

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

这个函数之后数字似乎没有改变。我对 [][]int 感到困惑。

【问题讨论】:

  • [][]int 只不过是[]int 的一部分。就这样对待。您必须返回结果并将其分配给原始切片。
  • 这里有两个重要的细节:第一,slice 不是指针类型;它包含指向底层数组的指针,但切片本身不是指针。这就引出了第二个细节,append返回一个新值的原因是因为当它需要调整大小时,它必须创建一个新的后备数组,而且由于切片实际上不是一个指针,所以你需要获取新的切回包含指向新后备数组的指针。
  • 永远记住,Go 中的 append 就像 C 中的 realloc。你必须始终使用返回值。 append之后原来的切片就没用了。
  • 哦,是的,分配给num 不会影响原始切片,因为num 是切片的副本,在调用函数时创建。

标签: go pass-by-value


【解决方案1】:

您的代码为名为@9​​87654321@ 的局部变量赋值。

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

如果你想在函数外改变nums的值,它必须是指针类型。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    相关资源
    最近更新 更多