Go 中的append()什麼時候會建立一個新的切片?
Context:
Go的append()函數用於將一個或多個元素追加到一個切片中,並且有文檔記載,當原始切片的容量不足時,會建立一個新的切片。然而,對向切片添加元素的遞歸演算法的調查表明,通過通道發送的切片在發送後似乎會被修改。
混亂:
這個觀察結果與文件相矛盾,文件顯示append()應該回傳一個新的切片。造成這種混亂的原因是,append() 文件引用了切片資料類型,而實際實作則使用切片描述符。
解決方案:
切片描述符由以下部分組成三個組成部分:長度、容量和指向基礎資料的指標。當呼叫append()時,它會傳回一個具有更新的長度和容量的新切片描述符。然而,指向底層資料的指標保持不變。
說明:
因此,雖然append()確實傳回了一個新的切片描述符,但實際資料仍然是在新舊切片之間共用。這是因為底層資料儲存在切片描述符指向的單獨記憶體位置中。
範例:
以下程式碼說明了此行為:
<code class="go">package main import "fmt" func main() { s := make([]int, 0, 5) s = append(s, []int{1, 2, 3, 4}...) a := append(s, 5) fmt.Println(a) b := append(s, 6) fmt.Println(b) fmt.Println(a) }</code>
輸出顯示兩個修改後的切片a 和b 與原始切片s 共享相同的基礎數據,即使它們具有不同的長度和容量。
以上是Go 的 `append()` 函數總是會建立一個新切片嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!