返回介绍

Select

发布于 2024-10-12 12:35:57 字数 1184 浏览 0 评论 0 收藏 0

上面介绍的都是只有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文