首頁 > 後端開發 > Golang > 為什麼刪除第一個切片元素會改變容量,但刪除最後一個元素卻不會?

為什麼刪除第一個切片元素會改變容量,但刪除最後一個元素卻不會?

Susan Sarandon
發布: 2024-11-02 21:58:02
原創
1057 人瀏覽過

Why Does Dropping First Slice Elements Change Capacity, But Dropping Last Elements Doesn't?

更改切片容量:刪除第一個和最後一個項目之間的差異

在探索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 = &amp;s[:cap(s)][0]
    }
    fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s)
}</code>
登入後複製

運行此修改後的程式碼演示了切片操作如何更改指針、長度和容量,從而確認上述行為。

以上是為什麼刪除第一個切片元素會改變容量,但刪除最後一個元素卻不會?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板