复制地图的所有元素到另一个

特定

var dst, src map[K]V 

我可以通过做复制从src所有条目到dst

 for k, v := range src { dst[k] = v } 

有没有更习惯的方式来做到这一点?

copy只适用于切片(和作为源的string )。

这看起来像一个完美的方式来做到这一点对我来说。 我不认为将一张地图复制到另一张地图上已经足够普及了。

使用简单for range循环是最有效的解决scheme。

请注意,内置copy不能将src的内存复制到dst的地址,因为它们可能具有完全不同的内存布局。 地图增长以适应存储在其中的项目的数量。 例如,如果你有一百万个元素的地图,它会比新创build的新地图占用更多的内存,所以内buildcopy不能仅仅复制内存而不分配新的内存。

如果地图很大,如果可以创build具有足够大容量的目标地图以避免重新调整和重新分配(初始容量不受其大小限制),则可以加快复制元素的速度,例如:

 dst := make(map[K]V, len(src)) for k, v := range src { dst[k] = v } 

如果性能不是问题(例如,您正在处理小地图),则可以使用reflect包创build一个通用解决scheme:

 func MapCopy(dst, src interface{}) { dv, sv := reflect.ValueOf(dst), reflect.ValueOf(src) for _, k := range sv.MapKeys() { dv.SetMapIndex(k, sv.MapIndex(k)) } } 

这个解决scheme不检查参数是否真的是地图,如果目的地不是nil 。 testing它:

 m1 := map[int]string{1: "one", 2: "two"} m2 := map[int]string{} MapCopy(m2, m1) fmt.Println(m2) m3 := map[string]int{"one": 1, "two": 2} m4 := map[string]int{} MapCopy(m4, m3) fmt.Println(m4) 

输出(在Go Playground上试试):

 map[1:one 2:two] map[one:1 two:2] 

你可以使用github.com/linkosmos/mapop

 input := map[string]interface{}{ "Key1": 2, "key3": nil, "val": 2, "val2": "str", "val3": 4, } input2 := map[string]interface{}{ "a2": "str", "a3": 4, } input = mapop.Merge(input, input2) input{"Key1": 2, "key3": nil, "val": 2, "val2": "str", "val3": 4, "a2": "str", "a3": 4}