Golang基础-- select的用法
select是golang在语言层面提供的多路IO复用的机制,其可以检测多个channel是否ready
三个题目示例来说明一下select的大概作用:
题目一:
声明两个channel,分别为chan1和chan2,依次启动两个协程,分别向两个channel中写入一个数据就进入 睡眠。select语句两个case分别检测chan1和chan2是否可读,如果都不可读则执行default语句。
import ( "fmt" "time" ) func main() { chan1 := make(chan int) chan2 := make(chan int) go func() { chan1 <- 1 time.Sleep(time.Second * 10) }() go func() { chan2 <- 2 //time.Sleep(time.Second) }() select { case <-chan1: fmt.Println("channel1 ready") case <-chan2: fmt.Println("channel2 ready") default: fmt.Println("default") } fmt.Println("main exit") }
select中各个case执行顺序是随机的,如果某个case中的channel已经ready,则执行相应的语句并退 出select流程,如果所有case中的channel都未ready,则执行default中的语句然后退出select流程。另外, 由于启动的协程和select语句并不能保证执行顺序,所以也有可能select执行时协程还未向channel中写入数据, 所以select直接执行default语句并退出。