在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中文網其他相關文章!