go關鍵字之select

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

相關文章
相關標籤/搜索