與內建 API 文件相反,append() 函數並不總是建立新切片。這是由原始切片的容量和要添加的元素數量決定的。
在提供的程式碼片段中,遞歸地建立布林值組合,感嘆號表示傳送到頻道的切片新增選項函數。然而,在 main() 中另一側出現的切片被修改了。
切片資料類型與其內部表示之間的區別引起了混亂。切片描述符由兩個整數(長度和容量)和一個指向底層資料的指標組成。因此,append() 傳回一個帶有新描述符的新切片,但指向資料的指標相同。
這在以下程式碼範例中進行了說明:
<code class="go">package main import "fmt" func main() { s := make([]int, 0, 5) // Create a slice with zero length and capacity 5 s = append(s, []int{1, 2, 3, 4}...) // Append a slice of integers a := append(s, 5) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(a) b := append(s, 6) // Append one element (slice descriptor and data pointer remain the same) fmt.Println(b) fmt.Println(a) }</code>
輸出:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 6]
這表示a 和b 共用相同的資料指針,因為原始切片仍然有容量。但是,如果我們將容量減少到4:
<code class="go">s := make([]int, 0, 4)</code>
輸出變為:
[1 2 3 4 5] [1 2 3 4 6] [1 2 3 4 5]
由於原始切片不再有足夠的容量,append() 建立一個新切片b .
的新資料指針以上是Golang 的 `append()` 函數何時分配新切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!