Go語言併發程式設計_select
阿新 • • 發佈:2021-01-25
select的應用場景
多個通道在接收資料的時候,如果沒有資料接收,就會發生阻塞,導致其餘通道無法接收。
為了實現同時監控多個通道並且從多個通道接收值的需求,同時避免使用迴圈提高效率,Go
內建了select
關鍵字來同時響應多個通道的操作。
select的使用
Go語言中的select使用了類似switch的語句,他有一系列的case分支和一個預設分支。每個case對應一個通道的通訊過程。select會一直等待,直到某個case通訊操作完成時,就會執行case分支對應的語句。
語法如下:
select {
case <-chan1:
//如果chan1接收到資料,則進行該case處理語句
case chan2<-1:
//如果chan2寫入資料成功,則進入此case處理語句
default:
//如果上面的都沒執行成功,則進入default
}
- 使用示例:
import (
"fmt"
"time"
)
func chan1Test(ch chan string) {
time.Sleep(time.Second*3)
ch<-"chan1Test"
}
func chan2Test(ch chan string) {
time.Sleep(time.Second*2)
ch<-"chan2Test"
}
func main() {
chan1 :=make(chan string)
chan2 :=make(chan string)
go chan1Test(chan1)
go chan2Test(chan2)
//防止main goroutine提前執行完成返回值,而fun1 fun2還沒執行
time.Sleep(time.Second*5)
//select監控
select {
case s1:=<-chan1:
fmt.Println("s1=",s1)
case s2:=<-chan2:
fmt.Println("s2=" ,s2)
default:
fmt.Println("沒有接收到資料!")
}
}
上例中select同時監聽了多個channel,當有多個channel同時準備好了的時候就會隨機選擇一個進行執行。這裡將列印
(修改time.Sleep(time.Second*3)
可測試不同的結果(一個channel準備好,或者是兩個channel同時準備好隨機執行其中一個))