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

How to get multiple map[string]int through channel and union of them into one map?

我正在实现一个计算单词的函数,我正在尝试用 goroutines 编写它。到目前为止,我已经制作了 []string 数组以适合原始字符串文本的大小,我将它们分别发送到一个 goroutine 以计算单词并将它们添加到 map[string]int 内的 k/v 对,然后我想通过我的频道将它们全部带走并阅读所有地图,然后简单地计算总共有多少单词和 return 这个 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
}

它告诉我 "too many variables in range"。

If I use for k, v := range channel it tells me to many variables in range

那是因为通道只是一个值列表,没有键。所以这样做:

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

现在 val 将成为您的地图之一,每次循环时,因此您可能也想对其进行测距:

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