【发布时间】: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