1. 程式人生 > 其它 >Go語言併發程式設計_select

Go語言併發程式設計_select

技術標籤:Go基礎go

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同時準備好隨機執行其中一個))