为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
莫回无 2022-06-06 16:59:04
我有以下程序作为概念证明。我试图从 聚合结果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}
查看完整描述

1 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

你想做的事情是可能的,但是你的程序不会运行,因为你在 wg.Wait() 之后从通道读取,所以所有的 goroutine 将停止等待写入,因为你永远不会从通道读取。


您可以从 goroutine 中的通道读取:


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

        wg.Add(1)

        go DoStuff(i, chann, &wg)

    }

}

go func() {

   for data:=range chann {

      // Process data

   }

}()

wg.Wait()

// Close here, so the reading goroutine can terminate

close(chann)


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信