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

Dictionary 将地图的所有元素复制到另一个地图中,dictionary,go,copy,Dictionary,Go,Copy,给定 我可以通过执行以下操作将所有条目从src复制到dst var dst, src map[K]V 有没有更惯用的方法 copy仅适用于切片(并且string作为源代码)。对我来说,这似乎是一个非常好的方法。我不认为将一个地图复制到另一个地图就足以得到一个线性解决方案。使用简单的for range循环是最有效的解决方案 请注意,内置的copy不能仅将src的内存复制到dst的地址,因为它们可能具有完全不同的内存布局。地图会增长以适应其中存储的项目数量。例如,如果你有一个有一百万个元素的映射,

给定

我可以通过执行以下操作将所有条目从
src
复制到
dst

var dst, src map[K]V
有没有更惯用的方法


copy
仅适用于切片(并且
string
作为源代码)。

对我来说,这似乎是一个非常好的方法。我不认为将一个地图复制到另一个地图就足以得到一个线性解决方案。

使用简单的
for range
循环是最有效的解决方案

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

如果您的地图很大,您可以加快复制元素的速度,前提是您可以创建具有足够大容量的目标地图,以避免重新灰化和重新分配(初始容量不限制其大小),例如:

如果性能不是问题(例如,您使用的是小型地图),则可以使用以下软件包创建通用解决方案:

此解决方案不检查参数是否真的是映射,以及目标是否不是
nil
。测试它:

func MapCopy(dst, src interface{}) {
    dv, sv := reflect.ValueOf(dst), reflect.ValueOf(src)

    for _, k := range sv.MapKeys() {
        dv.SetMapIndex(k, sv.MapIndex(k))
    }
}
输出(在上尝试):

你可以用


“我认为将一张地图复制到另一张地图是不够普遍的”。。。这是我对围棋最恼火的地方。在其他任何一种语言的原生类型上都很容易做到这一点。@Edufilipe我同意。Go内置泛型类型(如maps)的特殊性质,以及在用户定义类型中无法获得相同类型的功能(如不支持泛型),是我在Go中遇到的最大问题之一。这只是我喜欢生锈的众多原因之一。与简单复制哈希表的假设内置函数相比,建议的解决方案是否有显著的性能成本?看看将一个映射复制到另一个映射还不够普遍?我恭敬地表示不同意。
dst := make(map[K]V, len(src))

for k, v := range src {
    dst[k] = v
}
func MapCopy(dst, src interface{}) {
    dv, sv := reflect.ValueOf(dst), reflect.ValueOf(src)

    for _, k := range sv.MapKeys() {
        dv.SetMapIndex(k, sv.MapIndex(k))
    }
}
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)
map[1:one 2:two]
map[one:1 two:2]
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}