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

我是 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

}

但这似乎很不正确。有人可以给我一些想法吗?


小怪兽爱吃肉
浏览 365回答 3
3回答

MMTTMM

根据您的要求,您可能需要为每次迭代读取两个通道(即某种“zip”功能)。您可以使用选择来执行此操作,类似于user860302的回答:func main() {&nbsp; c1 := make(chan int)&nbsp; c2 := make(chan int)&nbsp; out := make(chan int)&nbsp; go func(in1, in2 <-chan int, out chan<- int) {&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; sum := 0&nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; case sum = <-in1:&nbsp; &nbsp; &nbsp; &nbsp; sum += <-in2&nbsp; &nbsp; &nbsp; case sum = <-in2:&nbsp; &nbsp; &nbsp; &nbsp; sum += <-in1&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; out <- sum&nbsp; &nbsp; }&nbsp; }(c1, c2, out)}这永远运行。我首选的终止这样的 goroutine 的方法是关闭输入通道。在这种情况下,您需要等待两者都关闭,然后close(out)再终止。提示:注意使用定向通道作为 goroutine 形式参数。以这种方式编写时,编译器会捕获更多错误。幸福!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go