我正在尝试根据各种goroutine的输出填充地图。为此,我创建了(map [key] [] int)类型的通道
done := make(chan map[int][]int)
并将其与键值(示例中为int)一起传递给worker goroutine。 对于我:= 0;我<10;我++ { 上班族(我完成) } 我想从钥匙中读取地图时填写地图。目前我正在做以下事情
for i := 0; i < 10; i++ {
m := <-done
fmt.Println(m)
for k,v := range m {
retmap[k] = v
}
}
fmt.Println(retmap)
我觉得我做的不正确。有没有更好的方法可以使用渠道做到这一点?任何建议将不胜感激?
答案 0 :(得分:1)
您可以为每个工作程序使用特定的通道,而不是将该信息编码到工作程序的结果对象中。像这样:
func worker(done chan []int) {
fmt.Print("working...")
rnd := rand.Intn(10)
fmt.Println("Sleeping for ", rnd, "seconds")
for i := 0; i < rnd; i++ {
time.Sleep(time.Second)
}
fmt.Println("done")
// Send a value to notify that we're done.
done <- makeRange(0, rnd)
}
func main() {
channels := make([]chan []int, 10, 10)
for i := 0; i < 10; i++ {
channels[i] = make(chan []int)
go worker(channels[i])
}
retmap := make(map[int][]int)
for i := 0; i < 10; i++ {
retmap[i] = <-channels[i]
}
fmt.Println(retmap)
}