文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Select
上面介绍的都是只有一个 channel
的情况,那么如果存在多个 channel
的时候,该如何操作呢,Go 里面提供了一个关键字 select
,通过 select
可以监听 channel
上的数据流动。
select
默认是阻塞的,只有当监听的 channel
中有发送或接收可以进行时才会运行,当多个 channel
都准备好的时候, select
是随机的选择一个执行的。
package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 1, 1
for {
select {
case c <- x:
x, y = y, x + y
case <-quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
quit <- 0
}()
fibonacci(c, quit)
}
在 select
里面还有 default
语法, select
其实就是类似 switch
的功能, default
就是当监听的 channel
都没有准备好的时候,默认执行的( select
不再阻塞等待 channel
)。
select {
case i := <-c:
// use i
default:
// 当 c 阻塞的时候执行这里
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论