package main import "time" import "fmt" func main() { // 本例中,咱們從兩個通道中選擇 c1 := make(chan string) c2 := make(chan string) // 爲了模擬並行協程的阻塞操做,咱們讓每一個通道在一段時間後再寫入一個值 go func() { time.Sleep(time.Second * 1) c1 <- "one" }() go func() { time.Sleep(time.Second * 2) c2 <- "two" }() // 咱們使用select來等待這兩個通道的值,而後輸出 select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) default: fmt.Println("default") } }
以上代碼只會輸出default就退出了,若是咱們去掉default,則只會輸出one,code
for i := 0; i < 2; i++ { // 咱們使用select來等待這兩個通道的值,而後輸出 select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) } }
若是在select外面加了for循環則會去循環。協程
總結起來,select只會對每一個case去遍歷一次,若是不符合Case1,則去判斷Case2,若是設定了default,對於都不符合的到default後直接跳出了。若是沒有設置default,則會等待Case1,case2中有一個符合退出。string