参考https://www.runoob.com/go/go-select-statement.html
以下描述了 select 语句的语法:
- 每个 case 都必须是一个通信
- 所有 channel 表达式都会被求值
- 所有被发送的表达式都会被求值
- 如果任意某个通信可以进行,它就执行,其他被忽略。
- 如果有多个 case 都可以运行,Select 会随机公平地选出一个执行。其他不会执行。
- 否则:
如果有 default 子句,则执行该语句。
如果没有 default 子句,select 将阻塞,直到某个通信可以运行;Go 不会重新对 channel 或值进行求值。
func main() {
c1 := make(chan int)
c2 := make(chan int)
go p(c1, c2)
for {
num := <-c1
fmt.Println(num)
if num > 100 {
c2 <- 0
break
}
}
}
func p(c1 chan int, c2 chan int) {
x, y := 1, 1
for {
select {
case c1 <- x:
x, y = y, x+y
case <-c2:
return
// default代码块可以删除
default:
fmt.Println(time.Now().UTC())
time.Sleep(time.Millisecond*100)
}
}
}
输出:
1
2022-09-04 12:08:42.8013056 +0000 UTC
1
2022-09-04 12:08:42.9110186 +0000 UTC
2
2022-09-04 12:08:43.0228097 +0000 UTC
3
2022-09-04 12:08:43.1273831 +0000 UTC
5
2022-09-04 12:08:43.2455167 +0000 UTC
2022-09-04 12:08:43.355908 +0000 UTC
8
13
2022-09-04 12:08:43.4634609 +0000 UTC
21
2022-09-04 12:08:43.5837671 +0000 UTC
2022-09-04 12:08:43.6964928 +0000 UTC
34
2022-09-04 12:08:43.8034457 +0000 UTC
55
2022-09-04 12:08:43.9044702 +0000 UTC
89
2022-09-04 12:08:44.0162425 +0000 UTC
144