select是go語言中常用的一個(gè)關(guān)鍵字,是用來監(jiān)聽和channel有關(guān)的IO操作,當(dāng) IO 操作發(fā)生時(shí),觸發(fā)相應(yīng)的動(dòng)作。
如果有多個(gè)case都可以運(yùn)行,Select會(huì)隨機(jī)公平地選出一個(gè)執(zhí)行。其他不會(huì)執(zhí)行。 (推薦學(xué)習(xí):go)
否則:
如果有default子句,則執(zhí)行該語句。
如果沒有default字句,select將阻塞,直到某個(gè)通信可以運(yùn)行;Go不會(huì)重新對(duì)channel或值進(jìn)行求值。
基本用法
//select基本用法 select { case <- chan1: // 如果chan1成功讀到數(shù)據(jù),則進(jìn)行該case處理語句 case chan2 <- 1: // 如果成功向chan2寫入數(shù)據(jù),則進(jìn)行該case處理語句 default: // 如果上面都沒有成功,則進(jìn)入default處理流程
如果有一個(gè)或多個(gè)IO操作可以完成,則Go運(yùn)行時(shí)系統(tǒng)會(huì)隨機(jī)的選擇一個(gè)執(zhí)行,否則的話,如果有default分支,則執(zhí)行default分支語句,如果連default都沒有,則select語句會(huì)一直阻塞,直到至少有一個(gè)IO操作可以進(jìn)行
start := time.Now() c := make(chan interface{}) ch1 := make(chan int) ch2 := make(chan int) go func() { time.Sleep(4*time.Second) close(c) }() go func() { time.Sleep(3*time.Second) ch1 <- 3 }() go func() { time.Sleep(3*time.Second) ch2 <- 5 }() fmt.Println("Blocking on read...") select { case <- c: fmt.Printf("Unblocked %v later.n", time.Since(start)) case <- ch1: fmt.Printf("ch1 case...") case <- ch2: fmt.Printf("ch1 case...") default: fmt.Printf("default go...") }
運(yùn)行上述代碼,由于當(dāng)前時(shí)間還未到3s。所以,目前程序會(huì)走default。