首頁 > 後端開發 > Golang > 主體

Golang 中的切片如何修改原始數組,即使它們按值傳遞給函數?

Linda Hamilton
發布: 2024-10-30 12:34:15
原創
520 人瀏覽過

How do slices in Golang modify the original array even though they are passed to functions by value?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!