首頁 > 後端開發 > Golang > Go 切片:為什麼使用'range”複製切片元素有時會導致共享記憶體位址?

Go 切片:為什麼使用'range”複製切片元素有時會導致共享記憶體位址?

Linda Hamilton
發布: 2024-12-19 02:12:09
原創
487 人瀏覽過

Go Slices: Why Does Copying Slice Elements Using `range` Sometimes Lead to Shared Memory Addresses?

Go:重複使用從切片複製記憶體位址

在 Go 中,range 函數迭代切片的元素。然而,一個常見的陷阱是循環變數重複使用記憶體位址。當嘗試將切片元素複製到另一個資料結構時,這可能會導致意外結果。

考慮以下程式碼片段:

// Regions is the collection of the Region model
type Regions []Region

// Returns the model collection as a list of models
func (coll *Regions) ToModelList() []Model {
    output := make([]Model, len(*coll))
    for idx, item := range *coll {
        output[idx] = &item
    }
    return output
}
登入後複製

在此程式碼中,循環變數 item 是指標引用到 *coll 切片中的元素。透過將 &item 指派給輸出切片的元素,多個元素最終會指向相同基礎 Region 物件。發生這種情況的原因是,output 和 *coll 共享 item 的相同記憶體位址。

要解決此問題,需要為輸出中的每個元素建立 Region 物件的不同副本。這可以透過使用以下程式碼片段來實現:

// Returns the model collection as a list of models
func (coll *Regions) ToModelList() []Model {
    output := make([]Model, len(*coll))
    for idx, _ := range *coll {
        i := (*coll)[idx]
        output[idx] = &i
    }
    return output
}
登入後複製

在此修訂後的程式碼中,_ 用作 *coll 範圍內的循環變數。這確保了每次迭代都會建立 i 的新副本,從而防止在循環迭代中重複使用記憶體位址。

了解 Go 記憶體管理的細微差別對於避免這些類型的陷阱並確保正確的程式執行至關重要.

以上是Go 切片:為什麼使用'range”複製切片元素有時會導致共享記憶體位址?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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