select是Go提供的一个抉择语句,通过select能够监听chanel上的数据流动。
select语句的应用办法和switch语句类似,由select开始一个新的抉择块,每一个抉择块,每一个抉择条件由case语句来实现。
和switch语句不同的中央在于,select的case条件都是chanel的通信操作, select语句依据不同的case有可能被阻塞,也可能被执行。
举个例子:
package mainimport ( "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