1. 语法结构
语句的语法结构与语句很相似,也有case语句和语句:
select { case communication clause : statement(s); case communication clause : statement(s); default : statement(s);}
阐明:
每个案例都必须是一次沟通
所有表达式都将被评估
所有发送的表达式都将被评估
如果有多个案例可以运行,则将随机公平地选择一个案例来执行。 其他人不会被处决。
否则:
如果有子句,则执行该语句。
如果没有的话,它将阻塞,直到某些通信可以运行; Go 不会重新计算 OR 值。
2. 示例代码
示例代码:
package mainimport ( "fmt" "time")func main() { ch1 := make(chan int) ch2 := make(chan int) go func() { time.Sleep(2 * time.Second) ch2 <- 200 }() go func() { time.Sleep(2 * time.Second) ch1 <- 100 }() select { case num1 := <-ch1: fmt.Println("ch1中取数据。。", num1) case num2, ok := <-ch2: if ok { fmt.Println("ch2中取数据。。", num2) }else{ fmt.Println("ch2通道已经关闭。。") } }}
运行结果:可能执行第一种情况,打印100,也可能执行第二种情况,打印200。 (多运行几次,结果会不一样)
该语句结合了time包和chan相关函数,示例代码:
package mainimport ( "fmt" "time")func main() { ch1 := make(chan int) ch2 := make(chan int) //go func() { // ch1 <- 100 //}() select { case <-ch1: fmt.Println("case1可以执行。。") case <-ch2: fmt.Println("case2可以执行。。") case <-time.After(3 * time.Second): fmt.Println("case3执行。。timeout。。") //default: // fmt.Println("执行了default。。") }}
运行结果: