Go 如何通过通道获得多个map[string]int,并将它们合并成一个map?

Go 如何通过通道获得多个map[string]int,并将它们合并成一个map?,go,maps,goroutine,channels,Go,Maps,Goroutine,Channels,我正在实现一个计算单词的函数,我正在尝试用goroutines编写这个函数。到目前为止,我已经将[]字符串数组制作成与原始字符串文本大小相适应的数组,并将这些数组发送到一个goroutine,每个goroutine计算单词数,然后将它们添加到映射[string]int中的k/v对中,然后我想通过我的频道阅读所有地图,简单地计算总共有多少个单词,然后返回这个map[string]int,但这就是我丢失的地方。我试着做一些类似的事情 mapSummary := make(map[string]int

我正在实现一个计算单词的函数,我正在尝试用goroutines编写这个函数。到目前为止,我已经将
[]字符串
数组制作成与原始字符串文本大小相适应的数组,并将这些数组发送到一个goroutine,每个goroutine计算单词数,然后将它们添加到
映射[string]int
中的k/v对中,然后我想通过我的频道阅读所有地图,简单地计算总共有多少个单词,然后返回这个
map[string]int
,但这就是我丢失的地方。我试着做一些类似的事情

mapSummary := make(map[string]int)
for k, v := range channel {
    mapSummary[k] += v
}
但这不起作用,因为我在这个范围内使用了两个变量,而只有一个变量,我不知道如何做到这一点。那么,如何将通过通道发送的所有这些地图添加到一起呢?我不需要你们告诉我这到底是怎么做的(这是一个家庭作业),但由于我在我们的实验室课程中没有得到助教的任何帮助,我将非常感激关于如何做的一些线索,我还看到我如何分发
[]字符串
数组并不好,但我会自己解决的!:)这段代码不包括主函数或大部分代码,而是我希望帮助您理解它的必要部分

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
}
ch:=make(chan-map[string]int)
对于i:=0;i<8;i++{
工作组.添加(1)
文字:=文本[i*(len(text)/8):(i+1)*(len(text)/8)]
开始计数(单词、ch、wg)
}
wg.Wait()
mapSummary:=make(映射[string]int)
对于k,v:=范围ch{
mapSummary[k]+=v
}
返回地图摘要
func count(单词[]字符串,ch chan

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

这是因为通道只是一个值列表,没有键。所以请执行以下操作:

for val := range channel {
    // ..
}
现在,
val
将是您的地图之一,每次通过循环,因此您可能也希望在该范围内:

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

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

这是因为通道只是一个值列表,没有键。所以请执行以下操作:

for val := range channel {
    // ..
}
现在,
val
将是您的地图之一,每次通过循环,因此您可能也希望在该范围内:

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

如果我使用k,v:=范围通道,它告诉我范围内有很多变量,所以我不知道怎么做。所以我的问题是,我如何迭代通过通道发送的所有映射,并将它们的并集变成一个映射?我知道我需要将所有键添加到并集映射中,然后对较小映射中的所有整数求和,但我不知道如果我使用k,v:=范围通道,它告诉我范围内有很多变量,所以我不知道怎么做。所以我的问题是,我如何迭代通过通道发送的所有映射,并将它们的并集成一个映射?我知道我需要将所有键添加到并集映射中,然后对所有键求和小地图上的整数,但我不知道该怎么做啊现在我明白了,谢谢你的帮助,Flimzy,现在就尝试实现:)啊现在我明白了,谢谢你的帮助,Flimzy,现在就尝试实现:)