- 通过select可以监听channel上的数据流动
- case语句里必须是一个IO操作
- 在一个select语句中,Go语言会按顺序从头至尾评估每一个发送和接收的语句
- 如果case满足,则执行对应语句
- 如果case全部不满足(即所有的通道都被阻塞)
- default语句,那么就会执行default语句
- 如果没有default语句,那么select语句将被阻塞
package main
import (
"fmt"
"time"
"runtime"
)
func main() {
ch := make(chan int) // 用来进行数据通信的 channel
quit := make(chan bool) // 用来判断是否退出的 channel
go func() { // 写数据
for i:=0; i<5;i++{
ch <- i
time.Sleep(time.Second)
}
close(ch)
quit <- true // 通知主go程 退出
runtime.Goexit()
}()
for { // 主go程 select 监听 channel
select {
case num := <-ch: // 不可读,阻塞。可以读,将数据保存至num
fmt.Println("获取:", num)
case <-quit: // 不可读,阻塞。可以读,将主go程结束。
// break // break 跳出 select 不可用
//runtime.Goexit() // runtime.Goexit()用来终断子协程,主协程不可用
return // 终止进程,如果不return,会一直读0,channel关闭之后读到的是0
}
}
}