select是Go中的一個控制結構,相似於switch語句,用於處理異步IO操做。select會監聽case語句中channel的讀寫操做,當case中channel讀寫操做爲非阻塞狀態(即能讀寫)時,將會觸發相應的動做。 select中的case語句必須是一個channel操做 select中的default子句老是可運行的。 若是有多個case均可以運行,select會隨機公平地選出一個執行,其餘不會執行。 若是沒有可運行的case語句,且有default語句,那麼就會執行default的動做。 若是沒有可運行的case語句,且沒有default語句,select將阻塞,直到某個case通訊能夠運行 典型用法 1.超時判斷 //好比在下面的場景中,使用全局resChan來接受response,若是時間超過3S,resChan中尚未數據返回,則第二條case將執行 var resChan = make(chan int) // do request func test() { select { case data := <-resChan: doData(data) case <-time.After(time.Second * 3): fmt.Println("request time out") } } func doData(data int) { //... } 2.退出 //主線程(協程)中以下: var shouldQuit=make(chan struct{}) fun main(){ { //loop } //...out of the loop select { case <-c.shouldQuit: cleanUp() return default: } //... } //再另一個協程中,若是運行遇到非法操做或不可處理的錯誤,就向shouldQuit發送數據通知程序中止運行 close(shouldQuit) 3.判斷channel是否阻塞 //在某些狀況下是存在不但願channel緩存滿了的需求的,能夠用以下方法判斷 ch := make (chan int, 5) //... data:=0 select { case ch <- data: default: //作相應操做,好比丟棄data。視需求而定 } ---------------------
參考:https://blog.csdn.net/zhaominpro/article/details/77570290?utm_source=debugrun&utm_medium=referral
注:select主要進行channel狀態的判斷,本質是channel可否有數據讀出,經過該判斷進行一些有趣的應用。緩存