golang 的 select 就是監聽 IO 操做,當 IO 操做發生時,觸發相應的動做。 golang
在執行select語句的時候,運行時系統會自上而下地判斷每一個case中的發送或接收操做是否能夠被當即執行(當即執行:意思是當前Goroutine不會所以操做而被阻塞)spa
select的用法與switch很是相似,由select開始一個新的選擇塊,每一個選擇條件由case語句來描述。與switch語句能夠選擇任何可以使用相等比較的條件相比,select有比較多的限制,其中最大的一條限制就是每一個case語句裏必須是一個IO操做,確切的說,應該是一個面向channel的IO操做。code
select 主要用於在Go語言中實現 channel 非阻塞式獲取或寫入數據,在默認狀況下 channel 收發數據都是阻塞式的。it
package main import "fmt" func main() { ch1 := make(chan int, 2) ch2 := make(chan int, 2) ch1 <- 1 ch2 <- 2 select { case e1 := <-ch1: //若是ch1通道成功讀取數據,則執行該case處理語句 fmt.Printf("1th case is selected. e1=%v", e1) case e2 := <-ch2: //若是ch2通道成功讀取數據,則執行該case處理語句 fmt.Printf("2th case is selected. e2=%v", e2) default: //若是上面case都沒有成功,則進入default處理流程 fmt.Println("default!.") } }