1. 程式人生 > >go關鍵字之select

go關鍵字之select

UNC quit ann lose 異步io lean details 有趣 動作

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能否有數據讀出,通過該判斷進行一些有趣的應用。

go關鍵字之select