golang select 小結
select 介紹
從不同併發執行的協程中,獲取資料可以用select來完成。select監聽的多個通道,也可以用通道傳送數值。
select { // 接收資料 case u:= <- ch1: ... // 傳送資料 case v:= <- ch2: ... ... default: // no value ready to be received ... }
select 基本用法
1、如果多個通道都阻塞了,會等待知道其中一個通道可以處理。
2、如果多個通道都可以處理,隨機選取一個處理。
3、如果沒有通道操作可以操作並且寫了default語句,會執行:default(永遠是可以執行的)
4、如果防止select堵塞,可以寫default來確保傳送不被堵塞,沒有case的select就會一直堵塞。
5、當select做選擇case和default操作時,case的優先順序大於default。
6、select語句實現了一種監聽模式,通常在無限迴圈中使用,通過在某種情況下,通過break退出迴圈。
示例1
package main import ( "time" "fmt" ) func doneSelect(ch chan int){ for{ fmt.Println("for迴圈-輸出-start") select { case data := <-ch: fmt.Println(data) break // 使用break只會跳出select //return使用return會跳出for迴圈 default: fmt.Println("select default testing") } fmt.Println("for迴圈-結束-end") } fmt.Println("for迴圈-跳出-end") } func do(){ ch := make(chan int) go doneSelect(ch) ch <- 666 } func main(){ do() time.Sleep(3*time.Second) }