从 golang 中的通道响应填充地图值

use*_*851 5 concurrency dictionary channel go

我正在尝试根据各种 goroutine 的输出来填充地图。为此,我创建了一个类型为 (map[key][]int) 的通道

done := make(chan map[int][]int)
Run Code Online (Sandbox Code Playgroud)

并将其与键值一起传递给工人 goroutine,在示例中键值是 int。对于我:= 0;我<10;i++ { goworker(i,done) } 我想在从键读取时填充我的地图。目前我正在做如下

for i := 0; i < 10; i++ {
    m := <-done
    fmt.Println(m)
    for k,v := range m {
        retmap[k] = v
    }
}
fmt.Println(retmap)
Run Code Online (Sandbox Code Playgroud)

我觉得我这样做不正确。有没有更好的方法使用渠道来做到这一点?任何建议将不胜感激?

游乐场:https://play.golang.org/p/sv4Qk4hEljx

Vin*_*ele 4

您可以为每个工作人员使用特定的通道,而不是在工作人员的结果对象中编码该信息。就像是:

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)
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接