首頁  >  文章  >  後端開發  >  Go 的 `append()` 函數總是會建立一個新切片嗎?

Go 的 `append()` 函數總是會建立一個新切片嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-31 03:17:30651瀏覽

Does Go's `append()` Function Always Create a New Slice?

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

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