Golang:揭开数组传递之谜
在本文中,我们将深入探讨 Golang 中数组传递的谜团。与其他一些通过引用隐式传递数组的语言不同,Golang 的方法是独特的。
探索混乱
Alan A.A. Donovan 和 Brian W. Kernighan 在《The Go 编程语言》中指出,Go 中的数组并不是通过引用隐式传递的。然而,仔细检查以下代码可能会产生问题:
<code class="go">func main() { tab := []int{1, 2, 3} fmt.Println(tab) // Results in [1 2 3] reverse(tab) fmt.Println(tab) // Results in [3 2 1] } func reverse(tab []int) { for i, j := 0, len(tab)-1; i < j; i, j = i+1, j-1 { tab[i], tab[j] = tab[j], tab[i] } }</code>
尽管没有通过引用传递数组,但反向函数会更改原始数组。这种行为看起来类似于 C 。
真相揭晓
关键在于认识到变量选项卡(主)和参数选项卡(相反)是不是数组,而是底层数组的切片。与数组不同,切片只是描述数组一部分的标头。当切片被传递时,仅复制这些标头,指向相同的后备数组。
基本区别
在 Go 中,数组长度是其类型所固有的(例如,[3]int),表示实际数组是按值传递的。然而,切片只是描述符,按值传递,但对其元素的修改会影响底层数组,因为它对于所有切片都是相同的。
其他见解
要更深入地了解,请参阅以下资源:
结论
Go 传递数组的方法是与其他一些语言不同。理解数组和切片之间的区别对于理解这种行为至关重要。切片作为灵活的标头,允许通过不同的切片副本修改底层数组。
以上是Go:数组是按引用传递还是按值传递?的详细内容。更多信息请关注PHP中文网其他相关文章!