Go_select
select语句的语法结构和switch语句很相似,也有case语句和default语句:
select { case communication clause : statement(s); case communication clause : statement(s); /* 你可以定义任意数量的 case */ default : /* 可选 */ statement(s); }
说明:
-
每个case都必须是一个通信
-
所有channel表达式都会被求值
-
所有被发送的表达式都会被求值
-
如果有多个case都可以运行,select会随机公平地选出一个执行。其他不会执行。
-
否则:
如果有default子句,则执行该语句。
package main import ( "fmt" "time" ) func main() { /* 分支语句:if,switch,select select语句类型于switch语句 但是select语句会随机执行一个可运行的case 如果没有case可以运行,要看是否有default,如果有就执行default,否则就进入阻塞,直到有case可以运行 */ 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 <- 200 }() 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..over...") }