Map 在go中实现两个地图的并集

Map 在go中实现两个地图的并集,map,go,union,Map,Go,Union,我有一个递归函数,它创建表示文件路径的对象(键是路径,值是关于文件的信息)。它是递归的,因为它只用于处理文件,所以如果遇到目录,该函数将在该目录上递归调用 尽管如此,我还是想在两个映射(即使用递归调用中的值更新的“主”映射)上做一个集合并集。除了迭代一个映射并将其中的每个键、值分配给另一个映射中的相同对象之外,还有一种惯用的方法来实现这一点吗 也就是说:给定a,b类型为map[string]*SomeObject,并且a和b最终被填充,是否有任何方法用b中的所有值更新a?没有内置的方法,标准包中

我有一个递归函数,它创建表示文件路径的对象(键是路径,值是关于文件的信息)。它是递归的,因为它只用于处理文件,所以如果遇到目录,该函数将在该目录上递归调用

尽管如此,我还是想在两个映射(即使用递归调用中的值更新的“主”映射)上做一个集合并集。除了迭代一个映射并将其中的每个键、值分配给另一个映射中的相同对象之外,还有一种惯用的方法来实现这一点吗


也就是说:给定
a,b
类型为
map[string]*SomeObject
,并且
a
b
最终被填充,是否有任何方法用
b
中的所有值更新
a

没有内置的方法,标准包中也没有任何方法来进行这种合并

idomatic的方法是简单地迭代:

for k, v := range b {
    a[k] = v
}

如果有两个嵌套映射,
left
right
,则此函数将递归地将
right
中的项添加到
left
中。如果键已经在
left
中,那么我们将递归到结构的更深处,并尝试只向
left
添加键(例如,永远不要替换它们)


类型m=map[string]接口{}
//给定两个映射,递归地将右合并到左,从不替换左中已经存在的任何键
func合并键(左、右m)m{
对于键,rightVal:=范围右侧{
如果为leftVal,则显示:=左[键];显示{
//然后我们不想替换它-递归
左[键]=合并键(左值(m),右值(m))
}否则{
//钥匙不在左边,所以我们可以把它推进去
左[键]=右值
}
}
左转
}

注意:我不处理值本身不是
map[string]接口{}
的情况。因此,如果你有
left[“x”]=1
right[“x”]=2
,那么在尝试
leftVal.(m)

时,上面的代码会死机。也许你可以使用一个实际的集合容器来完成这类工作:拉尔夫的建议对集合很有用。然而,我想说,在你的情况下,与其说它是一个联盟,不如说它是一个合并;一个集合应该只是“键”的集合,而你有两个键值对的集合,其中一个“集合”应该优先于另一个。计算两个映射的并集可能没有任何方法比简单地在两个映射上迭代更快。您可能可以使用反射来编写类型不可知的并集函数,但速度会更慢。在将v分配给[k]之前,此代码不应该并集[k]和v的值吗?如果a[k]和v是数组或映射呢?他希望合并映射,而不一定是映射中的值。如果你想做那样的事情,你只需要把
a[k]=v
改成
a[k]=a[k]+v
或类似的东西。@Kyle我想你是对的。对于实际的联合,可以使用:
a[k]=append(a[k],v…)