如何通过 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
}
}
我正在实现一个计算单词的函数,我正在尝试用 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
}
}