麻烦解说下go中的select概念

悲惨的大爷
  • 2.1k
func fibonacci(c, quit chan int) {
    x := 1;
    for {
        select {
        case c <- x:
            x += 1;
        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
        quit <- 0
    }()
    fibonacci(c, quit)
}

比如说上面的代码, select 中是如何触发的呢?
和事件触发一样的吗?
case 语句又是怎么运行的呢?


搞明白了些,自答
select概念
在channel 中,无缓冲区的情况下,读取,写入后都会阻塞.
在 select 中
case 某个 channel 后,会被阻塞,当这个 channel 在其他地方被操作后,当前这个 case 会被触发,执行下面的语句.
如果没有case需要处理,则会选择default去处理,如果default case存在的情况下。如果没有default case,则select语句会阻塞,直到某个case需要处理

func fibonacci(c, quit chan int) {
       for {
              select {
              case v := <-c:        // c 为空时,会被阻塞住,直到 channel 中有数据弹出
                     fmt.Println(v);
              case <-quit:
                     fmt.Println("quit")
                     return;
              }
       }
}

func main() {
       c := make(chan int)
       quit := make(chan int)
       go func() {
              for i := 0; i < 10; i++ {
                     c <- i;               //写入到c 中一个数据后,会被阻塞,直到 channel 中的这个数据被读取
              }
              quit <- 0
       }()
       fibonacci(c, quit)
}
回复
阅读 5k
1 个回答

select是和case一起出现的,可以理解为switch与case,select是任意选择case中的一条可以执行的语句来执行(即不阻塞),只要任何一个通道没被阻塞,就会执行。case语句其实有点像if。如果说的有什么不对,欢迎指正,大家一起学习。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏