如何通过通道获取多个map [string] int并将它们合并为一张地图?

时间:2019-04-04 10:38:55

标签: go maps goroutine channels

我正在实现一个计算单词数的函数,并且试图用goroutines编写它。到目前为止,我已经将[]string数组制作为原始字符串文本的适当大小,然后将它们发送到goroutine中,每个数组都对单词进行计数,并将它们添加到map[string]int内的k / v对中,然后我想要使其全部通过我的频道并阅读所有地图,然后简单地计算总共有多少个单词并返回此map[string]int,但这就是我迷路的地方。我试图做类似

mapSummary := make(map[string]int)
for k, v := range channel {
    mapSummary[k] += v
}

但是这不起作用,因为我正在使用该范围内的两个变量,并且只有一个我不确定如何执行此操作。那么,如何将通过渠道发送的所有这些地图加在一起?我不需要你们确切地告诉我这是如何完成的(这是一项家庭作业),但是由于我在实验期间没有从我的助教那里得到任何帮助,因此,我将不胜感激一些应该如何做的线索,我也看到我如何分配[]string数组不好,但是我会弄清楚自己的! :)此代码不包括主要功能或大部分代码,但希望能帮助您理解的必要部分。

ch := make(chan map[string]int)
for i := 0; i < 8; i++ {
    wg.Add(1)
    words := text[i*(len(text)/8):(i+1)*(len(text)/8)]
    go count(words, ch, wg)
}
wg.Wait()

mapSummary := make(map[string]int)
for k, v := range ch {
    mapSummary[k] += v
}
return mapSummary

func count(words []string, ch chan<- map[string]int, wg *sync.WaitGroup) {
    freqs := make(map[string]int)
    for _, word := range words {
        freqs[word] += 1
    }
    wg.Done()
    ch <- freqs
}

它告诉我“范围内的变量太多”。

1 个答案:

答案 0 :(得分:0)

  

如果我使用k,v:=范围通道,它会告诉我很多范围内的变量

这是因为通道只是值列表,没有键。这样做:

for val := range channel {
    // ..
}

现在val将成为您的地图之一,每次通过循环,因此您可能也希望在其上进行定位:

for val := range channel {
    for k, v := range val {
        // Put your aggregation logic here
    }
}