首頁 >後端開發 >Golang >為什麼附加到 Go 切片不會影響指向同一底層數組的其他切片?

為什麼附加到 Go 切片不會影響指向同一底層數組的其他切片?

Patricia Arquette
Patricia Arquette原創
2024-11-15 00:43:02704瀏覽

Why Doesn't Appending to a Go Slice Affect Other Slices Pointing to the Same Underlying Array?

理解Append 在切片上的行為

問題描述:

考慮以下Go 程式碼:

func main() {
    slice := make([]int, 10, 10)
    slice[0] = 0
    slice[1] = 1

    slice1 := slice
    slice1[0] = 10000
    fmt.Println(slice)

    slice1 = append(slice1, 100)
    slice1[0] = 20000

    fmt.Println(slice)
}

考慮以下Go 程式碼:

初始輸出符合預期:slice 和slice1 顯示相同的值。然而,在對slice1進行追加操作後,slice的值保持不變。假設切片是指針,這種行為似乎違反直覺。

解釋:

append 函數不會修改 slice1。 Go 會以值傳遞所有值,因此 slice1 接收 slice 的副本。由於原始數組已達到其容量,追加操作會建立一個新數組。然後,它將舊數組的內容複製到新數組中,並傳回指向新數組的新切片頭。

將回傳值指派給 slice1 會改變 slice1。但是,切片不受影響,因為它是指向原始數組的單獨變數。因此,append操作後對slice1或slice的元素所做的任何更改都不會反映在另一個中。

綜上所述,Go中的切片是按值傳遞的,append透過new建立新的切片必要時底層數組。這意味著對一個切片所做的更改不會反映在指向原始數組的其他切片中。

以上是為什麼附加到 Go 切片不會影響指向同一底層數組的其他切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn