是否有内置功能去制作任意地图的副本?
我可以手工编写,但我之前发现当我想对地图进行深入比较时,我正在寻找类似的问题,似乎已经内置了一个函数!所以类似地,也许我想知道是否有内置的或一些库或包用于在golang中制作地图的深层副本。我相信我不是第一个想要复制地图的人。
副本我的意思是你可以创建两个不同的变量来引用内存中的不同映射,即使它们是相同的内容。
是否有内置功能去制作任意地图的副本?
我可以手工编写,但我之前发现当我想对地图进行深入比较时,我正在寻找类似的问题,似乎已经内置了一个函数!所以类似地,也许我想知道是否有内置的或一些库或包用于在golang中制作地图的深层副本。我相信我不是第一个想要复制地图的人。
副本我的意思是你可以创建两个不同的变量来引用内存中的不同映射,即使它们是相同的内容。
有关更一般的答案,您可以对地图进行编码并使用新变量对其进行解码 编码/料滴。
这种方式的优点是它甚至可以处理更复杂的数据结构,比如包含一片地图的结构片。
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
}
如果你想了解更多关于gobs的信息,可以选择 关于它的博客文章。
为了增加Simpfally的答案,有些人会想到 encoding/gob
是结构,只复制导出的字段。并且频道无法编码。
复制地图是一些简单的代码行。只需编写代码,尽情享受每个简单代码必须在库中的想法!
original := map[string]int{
"Hello": 4,
"World": 123,
}
copy := map[string]int{}
for k, v := range original {
copy[k] = v
}