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