Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 合并Golang中的地图_Dictionary_Go_Concurrency_Channel - Fatal编程技术网

Dictionary 合并Golang中的地图

Dictionary 合并Golang中的地图,dictionary,go,concurrency,channel,Dictionary,Go,Concurrency,Channel,我正在尝试同时合并多个地图。 我想从一个频道弹出两个贴图,合并这两个贴图,并将合并后的贴图发送回同一频道,直到合并贴图完成 更重要的是,我同时生成地图,我希望在有两个可用地图时立即开始合并地图。最后,我希望有一个所有生成的地图的合并地图 我想做这样的东西: func processMaps(c1 chan map[string]int) { for map1 := range c1 { map2 := <-c1 mergedMap := mergeM

我正在尝试同时合并多个地图。 我想从一个频道弹出两个贴图,合并这两个贴图,并将合并后的贴图发送回同一频道,直到合并贴图完成

更重要的是,我同时生成地图,我希望在有两个可用地图时立即开始合并地图。最后,我希望有一个所有生成的地图的合并地图

我想做这样的东西:

func processMaps(c1 chan map[string]int) {
    for map1 := range c1 {
        map2 := <-c1
        mergedMap := mergeMaps(map1, map2)
        c1 <- mergedMap
        }
    }
}
func进程映射(c1 chan map[string]int){
对于map1:=范围c1{

map2:=从空地图开始,并将频道上接收到的任何地图合并到地图:

merged := make(make[string]int)
for m := range c {
    for k, v := range m {
       merged[k] = v
    }
}
当通道
c
关闭时,循环退出。map
merged
是在
c
上接收的所有映射的合并


使用变量引用合并映射,而不是将合并映射发送回频道。将合并映射发送回频道会使结束条件更加复杂,而不会增加并发性。

根据您概述的方法,您可能会创建许多映射(这很昂贵!)并一次又一次地复制键和值。我建议您采用一种更简单的解决方案,如答案所示,将映射保留在函数的上限范围内;随着新映射的出现,将两者合并。当然,这不是很并行,但其他解决方案可能会更昂贵,或者需要互斥。如果您真的死心塌地设置同时,您可以给出一个快照-。