我正在实现一个计算单词的函数,我正在尝试用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
阵列并不好,但我会弄清楚自己! :)此代码不包括main函数或大部分代码,但我希望帮助您理解它的必要部分。
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
}
它告诉我“范围内的变量太多”。
如果我使用k,v:= range channel它会告诉我范围内的许多变量
那是因为一个频道只是一个值列表,没有密钥。这样做:
for val := range channel {
// ..
}
现在val
将成为你的地图之一,每次都在循环中,所以你可能也想要超越它:
for val := range channel {
for k, v := range val {
// Put your aggregation logic here
}
}