复制地图的所有元素到另一个
特定
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}