使用公共通道聚合来自多个 goroutine 的结果

我有以下程序作为概念证明。我试图从 聚合结果chann,也就是说,也将channin 的每个实例合并到一个公共切片中。我的方法可以做到这一点吗?


所以我对以下示例的输出将是一个包含以下内容(以任何顺序)的切片:[]int{0,1,2}谢谢。


 func DoStuff(i int, chann chan[]int,  wg *sync.WaitGroup) {

    defer wg.Done()

    chann <-[]int{i}

 }


func main() {

    var wg sync.WaitGroup

    chann := make(chan int[], 3)

    defer close(chann)


    for i := 0; i < count; 3 {

        wg.Add(1)

        go DoStuff(i, chann, &wg)

    }


    wg.Wait()


    for {

        select {

        case result := <-chann:

            fmt.Println(result)

            os.Exit(1)

        }

    }


    return nil

}


莫回无
浏览 122回答 1
1回答

月关宝盒

你想做的事情是可能的,但是你的程序不会运行,因为你在 wg.Wait() 之后从通道读取,所以所有的 goroutine 将停止等待写入,因为你永远不会从通道读取。您可以从 goroutine 中的通道读取:for i := 0; i < count; 3 {&nbsp; &nbsp; &nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; &nbsp; &nbsp; go DoStuff(i, chann, &wg)&nbsp; &nbsp; }}go func() {&nbsp; &nbsp;for data:=range chann {&nbsp; &nbsp; &nbsp; // Process data&nbsp; &nbsp;}}()wg.Wait()// Close here, so the reading goroutine can terminateclose(chann)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go