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

在 Golang 中同时从多个通道读取

在 Golang 中同时从多个通道读取

Go
小怪兽爱吃肉 2021-07-08 14:02:14
我是 Golang 的新手。现在我正在研究如何在Golang中创建一个任意一对一的频道,设置如下:假设我有两个 goroutine numgen1 和 numgen2 同时执行并将数字写入通道 num1 和 numgen2。编号 2。我想在新进程 addnum 中添加从 numgen1 和 numgen2 发送的数字。我试过这样的事情:func addnum(num1, num2, sum chan int) {    done := make(chan bool)    go func() {        n1 := <- num1        done <- true    }()        n2 := <- num2        <- done    sum <- n1 + n2}但这似乎很不正确。有人可以给我一些想法吗?
查看完整描述

3 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

根据您的要求,您可能需要为每次迭代读取两个通道(即某种“zip”功能)。您可以使用选择来执行此操作,类似于user860302的回答:


func main() {


  c1 := make(chan int)

  c2 := make(chan int)

  out := make(chan int)


  go func(in1, in2 <-chan int, out chan<- int) {

    for {

      sum := 0

      select {

      case sum = <-in1:

        sum += <-in2


      case sum = <-in2:

        sum += <-in1

      }

      out <- sum

    }

  }(c1, c2, out)

}

这永远运行。我首选的终止这样的 goroutine 的方法是关闭输入通道。在这种情况下,您需要等待两者都关闭,然后close(out)再终止。


提示:注意使用定向通道作为 goroutine 形式参数。以这种方式编写时,编译器会捕获更多错误。幸福!


查看完整回答
反对 回复 2021-07-12
  • 3 回答
  • 0 关注
  • 364 浏览
慕课专栏
更多

添加回答

举报

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