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