select的使用及典型用法

select的使用及典型用法

碼字指示程式程式和軟體

基本使用

select是Go中的一個控制結構,類似於switch語句,用於處理非同步IO操作。select會監聽case語句中channel的讀寫操作,當case中channel讀寫操作為非阻塞狀態(即能讀寫)時,將會觸發相應的動作。

select中的case語句必須是一個channel操作select中的default子句總是可執行的。

如果有多個case都可以執行,select會隨機公平地選出一個執行,其他不會執行。

如果沒有可執行的case語句,且有default語句,那麼就會執行default的動作。

如果沒有可執行的case語句,且沒有default語句,select將阻塞,直到某個case通訊可以執行

例如:

package mainimport “fmt”func main() { var c1, c2, c3 chan int var i1, i2 int select { case i1 = <-c1: fmt。Printf(“received ”, i1, “ from c1\n”) case c2 <- i2: fmt。Printf(“sent ”, i2, “ to c2\n”) case i3, ok := (<-c3): // same as: i3, ok := <-c3 if ok { fmt。Printf(“received ”, i3, “ from c3\n”) } else { fmt。Printf(“c3 is closed\n”) } default: fmt。Printf(“no communication\n”) }}//輸出:no communication

典型用法

1。超時判斷

//比如在下面的場景中,使用全域性resChan來接受response,如果時間超過3S,resChan中還沒有資料返回,則第二條case將執行var resChan = make(chan int)// do requestfunc 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:=0select {case ch <- data:default: //做相應操作,比如丟棄data。視需求而定}