select是Go提供的一个选择语句,通过select可以监听chanel上的数据流动。
select语句的使用方法和switch语句相似,由select开始一个新的选择块,每一个选择块,每一个选择条件由case语句来实现。
和switch语句不同的地方在于,select的case条件都是chanel的通信操作, select语句根据不同的case有可能被阻塞,也可能被执行。
举个例子:
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
time.Sleep(3 * time.Second)
ch1 <- 100
}()
go func() {
time.Sleep(3 * time.Second)
ch2 <- 100
}()
select {
case num1 := <-ch1:
fmt.Println("ch1中获取的数据: ", num1)
case num2, ok := <-ch2:
if ok {
fmt.Println("ch2中读取的数据: ", num2)
} else {
fmt.Println("ch2 已关闭")
}
//default:
// fmt.Println("default语句可选 可有可无")
}
fmt.Println("main goroutine has been completed")
}
这里由于ch1和ch2都写入了数据,select会随机选择一个case执行,有default语句就执行default语句,都没有的话就阻塞直到有满足条件的case出现。
参考:bilibili
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。