首頁 >後端開發 >Golang >為什麼附加到 Go 切片有時會修改原始切片?

為什麼附加到 Go 切片有時會修改原始切片?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-31 17:00:30856瀏覽

Why does appending to a Go slice sometimes modify the original slice?

Golang Append 的切片分配行為

在 Go 中,當追加到切片時,有必要了解分配行為以確保高效處理。

根據內建API文檔,當現有切片容量不足時,append()函數會重新分配資料並將資料複製到新的陣列區塊中。這引發了關於切片描述符和從append()返回的切片的性質的問題。

在提供的用於生成組合的遞歸演算法中,append()函數用於增量構造切片。但是,據觀察,從 AddOption 函數通過通道發送的切片在發送後會被修改。這與append()應該回傳一個新切片的期望相矛盾。

要解決這種明顯的差異,必須澄清切片資料類型與其底層表示之間的區別。切片描述子由兩個整數(長度和容量)和一個指向實際資料的指標組成。當append()建立新切片時,它會產生一個新的切片描述符,但保留與原始切片相同的資料指標。因此,對任一切片描述符所做的更改都會影響兩個切片。

為了說明這一點,請考慮以下程式碼片段:

<code class="go">s := make([]int, 0, 5)
s = append(s, []int{1, 2, 3, 4}...)

a := append(s, 5)
fmt.Println(a)  // [1 2 3 4 5]

b := append(s, 6)
fmt.Println(b)  // [1 2 3 4 6]
fmt.Println(a)  // [1 2 3 4 6]</code>

最初,s 的容量為 5,並使用 make 構造()。 append() 用於將另一個切片的元素加入到 s 中。然後,使用帶有不同元素的 s 上的append() 建立兩個新切片a 和b。觀察輸出,a和b都包含相同的數據,顯示它們共享相同的數據指標。這示範了上述行為。

為了確保高效率的切片操作,理解append() 的這種分配行為至關重要。如果現有切片的容量足夠,append()將直接操作現有資料指針,從而提高效率。

以上是為什麼附加到 Go 切片有時會修改原始切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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