我正在实现一个计算单词数的函数,并且试图用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
}
它告诉我“范围内的变量太多”。
答案 0 :(得分:0)
如果我使用k,v:=范围通道,它会告诉我很多范围内的变量
这是因为通道只是值列表,没有键。这样做:
for val := range channel {
// ..
}
现在val
将成为您的地图之一,每次通过循环,因此您可能也希望在其上进行定位:
for val := range channel {
for k, v := range val {
// Put your aggregation logic here
}
}