参考:https://www.runoob.com/go/go-select-statement.html
select
- 每个case都是一个通信,要么发送,要么接收
- 除去defalut
- 循环检测条件,如果满足就执行并结束,如果不满足就一直循环
- default是默认的,如果在有default的情况下,前面的都不满足,那么这个select肯定就执行default,并结束
- 没有default,且case都不满足,会阻塞,一直循环判断,直到有满足的
- 如果有多个满足的,那么公平随机一个,其他忽略
package main
import (
"fmt"
"time"
)
func main() {
a := make(chan int, 1)
b := make(chan int, 1)
go func() {
for i := 0; i < 10; i++ {
time.Sleep(1000)
a <- i
}
}()
go func() {
for i := 0; i < 10; i++ {
time.Sleep(2000)
b <- i
}
}()
for i := 0; i < 30; i++ {
select {
case v := <-a:
fmt.Println("get a : ", v)
case v := <-b:
fmt.Println("get b : ", v)
default:
time.Sleep(1000)
fmt.Println("223343")
}
}
}