更改切片容量:刪除第一個和最後一個項目之間的差異
在探索Go 的切片功能時,出現了一個常見問題:為什麼切片的刪除前n 個項目與刪除最後n 個項目時容量的行為有所不同?
要回答這個問題,了解Go 切片的結構如下很重要:
type slice struct { array unsafe.Pointer len int cap int }
刪除最後n 個項目
從切片中刪除當最後n 個項目時(例如,s = s[:len(s)-2]),切片的資料仍儲存在底層陣列中。 len 欄位被更新以反映切片的新長度,而 cap 字段保持不變。這將為切片保留相同的數組分配。
刪除前n 個項目
但是,當刪除前n 個項目時(例如s = s[2: ]),切片的基礎資料需要移動到同一數組的不同部分。這是因為前 n 個元素的原始記憶體位置不再有效。結果,使用不同的陣列指標建立了一個新切片,同時調整 len 和 cap 欄位。
為了說明這一點,讓我們增強printSlice 函數以顯示指向底層數組的指針:
<code class="go">func printSlice(s []int) { var ptr *int if cap(s) >= 1 { ptr = &s[:cap(s)][0] } fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s) }</code>
運行此修改後的程式碼演示了切片操作如何更改指針、長度和容量,從而確認上述行為。
以上是為什麼刪除第一個切片元素會改變容量,但刪除最後一個元素卻不會?的詳細內容。更多資訊請關注PHP中文網其他相關文章!