登录
首页 >  Golang >  Go问答

合并多个 Go 例程的输出到一个公共通道

来源:stackoverflow

时间:2024-02-18 17:03:20 318浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《合并多个 Go 例程的输出到一个公共通道》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

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

因此,以下示例的输出将是一个包含以下内容(以任意顺序)的切片:[]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
}

解决方案


你想做的事情是可能的,但是你的程序不会运行,因为你在 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)

以上就是《合并多个 Go 例程的输出到一个公共通道》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>