Go語言Select的理解

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

相關文章
相關標籤/搜索