首頁 > 後端開發 > Golang > 如何深度複製Go Map並清除原始而不影響複製?

如何深度複製Go Map並清除原始而不影響複製?

Susan Sarandon
發布: 2024-12-30 13:05:09
原創
497 人瀏覽過

How to Deep Copy a Go Map and Clear the Original Without Affecting the Copy?

在Go 中建立關聯映射:如何深度複製並清除原始內容

在Go 中,您正在嘗試複製內容將一個名為aMap 的對應轉換為另一個名為aSuperMap 的對應。隨後,您希望清除 aMap 以在下一次循環迭代中接受新值。但是,您面臨著清除地圖而不清除 aSuperMap 中的引用的問題。

引用問題

您的偽代碼說明了當您刪除使用delete(aMap, x)從aMap中刪除一個項目,對該項目的引用也會從aSuperMap中刪除。這是因為 aSuperMap[y] 儲存了 aMap 的引用,當您修改 aMap(在本例中是透過刪除某個項目)時,您實際上是在修改 aSuperMap 指向的基礎資料。

深度複製映射

要在 Go 中真正建立關聯映射,您需要執行映射的深度複製。這涉及到使用自己的資料副本創建一個新的地圖對象,而不是簡單地保存對原始地圖的引用。

您可以透過手動建立一個 for循環來迭代原始地圖並添加每個鍵值對到新地圖:

for k, v := range originalMap {
    newMap[k] = v
}
登入後複製

通過這樣做,您創建了一個新地圖,其中包含與原始地圖相同的數據,但這兩個地圖是單獨的對象,具有自己的副本

清除原始地圖

擁有地圖的深層副本後,您可以清除原始地圖,而不會影響新地圖。為此,您可以使用container/list 套件中的重置功能:

for something := range fruits {
    aMap := make(map[string]aStruct)
    aSuperMap := make(map[string]map[string]aStruct)

    for x := range something {
        aMap[x] = aData
        aSuperMap[y] = aMap
        delete(aMap, x)
    }

    // Deep copy aMap into newMap
    newMap := make(map[string]aStruct)
    for k, v := range aMap {
        newMap[k] = v
    }

    // Clear the original aMap
    container/list.Reset(aMap)

    // Save the new map
    saveASuperMap(newMap)
}
登入後複製

按照以下步驟,您可以在Go 中成功建立關聯映射,執行映射的深層複製以保留原始數據,並清除原始映射以在下一次循環迭代中接受新值。

以上是如何深度複製Go Map並清除原始而不影響複製?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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