小编典典

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

go

我是Golang的新手。现在,我正在尝试找出如何在Golang中建立任意一对一频道的方法,其设置如下:

说我有两个goroutines numgen1和numgen2同时执行并将数字写入通道num1resp。num2。我想在新进程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
}

但这似乎令人遗憾。有人可以给我一些想法吗?

非常感谢您的帮助。


阅读 554

收藏
2020-07-02

共1个答案

小编典典

根据您的要求,您可能需要为每次迭代读取 两个 通道(即某种“zip”功能)

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形式参数。这样编写时,编译器会遇到更多错误。幸福!

2020-07-02