根据Golang中的通道响应填充地图值

时间:2018-10-25 08:42:40

标签: dictionary go concurrency channel

我正在尝试根据各种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)

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

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

1 个答案:

答案 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)
}

Playground link