Select用法

Go里面提供了一個關鍵字select,通過select可以監聽channel上的數據流動。
select的用法與switch語言非常類似,由select開始一個新的選擇塊,每個選擇條件由case語句來描述。
與switch語句相比, select有比較多的限制,其中最大的一條限制就是每個case語句里必須是一個IO操作,大致的結構如下
select {
case <-chan1:
// 如果chan1成功讀到數據,則進行該case處理語句
case chan2 <- 1:
// 如果成功向chan2寫入數據,則進行該case處理語句
default:
// 如果上面都沒有成功,則進入default處理流程
}
普通的代碼
package main
import (
"fmt"
"time"
)
func WorkHere(quit chan interface{}) {
for {
select {
case <-quit:
fmt.Println("over")
return
default:
time.Sleep(time.Millisecond * 100)
fmt.Println("work")
}
}
}
func main() {
var (
quit chan interface{}
)
quit = make(chan interface{})
go WorkHere(quit)
time.Sleep(2 * time.Second)
quit<- "quit"
}
# 輸出
work
work
..........此處省略一萬字
work
work
over
小結
用法: 參考 switch case 語句。 但!case后面必須是IO操作,不可以任意寫判別表達式。
注意事項:
1. 監聽的case中,沒有滿足監聽條件,阻塞。
2. 監聽的case中,有多個滿足監聽條件,任選一個執行。
3. 可以使用default來處理所有case都不滿足監聽條件的狀況。 通常不用(會產生忙輪詢)
4. select 自身不帶有循環機制,需借助外層 for 來循環監聽
5. break 跳出 select中的一個case選項 。類似於switch中的用法。