在 Golang 中将数组传递给函数并修改它们
在 C 等编程语言中,数组在传递给函数时是通过引用隐式传递的。然而,在 Golang 中,这种行为是不同的,这可能会让来自其他语言的人感到困惑。
区别:数组与切片
在提供的代码中例如:
<code class="go">func main() { tab := []int{1, 2, 3} fmt.Println(tab) reverse(tab) fmt.Println(tab) } 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>
看起来数组是按值传递的(不是引用),但是reverse函数仍然修改了原始数组。这里的关键是,在Golang中,“tab”不是数组,而是切片。
Go中的切片
切片是轻量级数据表示数组的连续部分的结构。它们由指向底层数组的指针、长度和容量组成。将切片传递给函数时,仅复制标头信息(指针、长度、容量),而不复制整个底层数组。
通过引用传递切片
因此,对函数内切片所做的任何更改都会影响底层数组,因为它们指向相同的数据。上面的例子中,reverse函数修改了切片的元素,进而影响了原来的数组tab。
结论
而Go中的数组是通过值(复制),切片通过引用传递(共享基础数据)。在将数组或切片传递给 Golang 中的函数以避免意外行为时,理解这种区别至关重要。
以上是Golang 中的切片如何修改原始数组,即使它们按值传递给函数?的详细内容。更多信息请关注PHP中文网其他相关文章!