select 在 golang 裡面是一個跟 switch 很像,但又只專屬用在 channel 的一個功能

select

select 功能其實蠻簡單的,如果你有多條 channel 要在一個線程,去控管它的輸出,這時侯就是運用 select 的好時機

package main

import (
	"fmt"
)

var sender1Channel chan string
var sender2Channel chan string

func Sender1() {
	sender1Channel <- "this is sender1"

}
func Sender2() {
	sender2Channel <- "this is sender2"
}

func main() {
	sender1Channel = make(chan string)
	sender2Channel = make(chan string)
	go Sender1()
	go Sender2()
	i := 0

	for {

		select {
		case msg := <-sender1Channel:
			fmt.Println(msg)
		case msg := <-sender2Channel:
			fmt.Println(msg)
		}

		//這邊因為只有兩個 sender 各送一條訊息,所以這個loop 只要執行兩次就可以 break,因為不會再有其他訊息進來
		i = i + 1
		if i >= 2 {
			break
		}

	}
	fmt.Println("end")
}

https://play.golang.org/p/-scW4ZbLEa5

要注意 select 到底會進入哪一條 case,外在是無法控制的,這是由 golang 內部演算法實作,所以如果 case 的情況多,的確有機會不會進到某 case 裡面。所以請斟酌使用方式。