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