在 Go 複製 Map:有內建函數嗎?
Go 中的 Map 是通用的資料結構,但是缺乏建立副本的內建功能可能是個障礙。幸運的是,有幾種方法可以幫助您實現這一目標。
使用encoding/gob 套件
對於通用解決方案,encoding/gob 套件提供了一種強大的方法來複雜資料結構的深層副本,包括映射。透過對原始映射進行編碼,然後將其解碼為新變量,您可以建立引用不同記憶體位置的副本。
package main import ( "bytes" "encoding/gob" "fmt" "log" ) func main() { ori := map[string]int{ "key": 3, "clef": 5, } var mod bytes.Buffer enc := gob.NewEncoder(&mod) dec := gob.NewDecoder(&mod) fmt.Println("ori:", ori) // key:3 clef:5 err := enc.Encode(ori) if err != nil { log.Fatal("encode error:", err) } var cpy map[string]int err = dec.Decode(&cpy) if err != nil { log.Fatal("decode error:", err) } fmt.Println("cpy:", cpy) // key:3 clef:5 cpy["key"] = 2 fmt.Println("cpy:", cpy) // key:2 clef:5 fmt.Println("ori:", ori) // key:3 clef:5 }
透過使用編碼/gob,您可以建立尊重嵌套結構的深層副本,例如地圖切片或包含切片的地圖。
其他注意事項
雖然coding/gob 提供了一個通用的解決方案,它可能不適合所有情況。如果您的映射相對簡單,您可以考慮編寫一個自訂函數來建立淺拷貝。此外,還有提供地圖複製功能的第三方函式庫。
請記住,Go 中的副本始終是深副本,這意味著它們創建資料的新實例,這與淺副本不同,淺副本僅建立對原始資料的參考。這是操作地圖時需要考慮的重要差異。
以上是如何在 Go 中有效創建地圖的深層副本?的詳細內容。更多資訊請關注PHP中文網其他相關文章!