语法
- select 的用法与 switch 语言非常类似,但区别在于/要求 1. 开头无字段 2. 每个 case 语句里必须是一个 IO 操作,或者什么都不写,默认执行 3. default语句可省略
- 判断标准
1. 执行这个case里的IO操作,并判断是否成功,若成功,则执行case内容,若阻塞,则不执行
2. 成功
如果有两个及以上的case满足条件,那么会随机公平的选出一个执行,其他不会执行 3. 阻塞
——如果没有可运行的case,那么有两种可能的情况: 1. 如果给出了 default 语句,那么就会执行 default 语句,同时程序的执行会从 select 语句后的语句中恢复。 2. 如果没有 default 语句,那么 select 语句将被阻塞,直到至少有一个通信可以进行下去。
:::info 实例——斐波那契数列
:::
package main
import "fmt"
func fibonacci(ch1 chan<- int, quit1 <-chan bool){
x,y :=1, 1
for{ //套在无限循环中,等命令进行来结束
select {
case ch1<-x:
x,y = y, x+y
case <-quit1:
fmt.Println("quit")
return
}
}
}
func main() {
ch := make(chan int) //数字通信
quit := make(chan bool)//用来命令计算结束的
go func() {
for i:=0; i<8; i++{ //计算数列个数为8的斐波那契数列
fmt.Println(<-ch)
}
quit<-true
}()
fibonacci(ch, quit) //ch在main作用域中,是双向的,在函数中是单向的,但由于channel是引用类型
}
回j结果
超时
实际工程中,阻塞不能永远执行下去,若超时,必须有个退出
- 语法:
case: <-time.After(n*time.Second)
- 实例1
结果: - 实例2——上面例子的有数据的时候
结果: