Golang 中同时读取多个通道
在 Golang 中,可以创建一个“任意对一”的通道,其中多个 goroutine 可以同时写入同一个通道。让我们探讨一下如何实现这个功能。
一种方法是使用 select 语句,它允许您等待多个通道接收数据:
func main() {
// Create input channels
c1 := make(chan int)
c2 := make(chan int)
// Create output channel
out := make(chan int)
// Start a goroutine that reads from both input channels and sums the received values
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 无限期地运行,从两个通道读取并将接收到的值的总和发送到输出通道。要终止 goroutine,需要关闭两个输入通道。
作为替代方法,您可以使用以下代码:
func addnum(num1, num2, sum chan int) {
done := make(chan bool)
go func() {
n1 := <-num1
done <- true // Signal completion of one channel read
}()
n2 := <-num2 // Read from the other channel
<-done // Wait for the first read to complete
sum <- n1 n2
}
此函数使用单独的“完成”通道来通知何时成功读取一个通道。然而,这种方法可能不太灵活,因为它需要修改写入输入通道的 goroutine。
适当的方法取决于应用程序的具体要求。无论您选择哪种方法,Golang 的并发特性都提供了同时处理多个通道的强大工具。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3