Go 的 select 讓您可以對多個通道作業進行等待。結合 goroutine 和通道以及 select 是 Go 的強大功能。
package main
import ( "fmt" "time" )
func main() {
對於我們的範例,我們會在兩個通道之間執行 select。
c1 := make(chan string) c2 := make(chan string)
每個通道都會在一段時間後收到一個值,以模擬平行 goroutine 中執行的封鎖式 RPC 作業。
go func() { time.Sleep(1 * time.Second) c1 <- "one" }() go func() { time.Sleep(2 * time.Second) c2 <- "two" }()
我們會使用 select 來同時等待這兩個值,並在抵達時印出每個值。
select
for i := 0; i < 2; i++ { select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) } } }
我們收到預期的值 "one" 和 "two"。
"one"
"two"
$ time go run select.go received one received two
請注意,總執行時間僅約 2 秒,因為 1 秒和 2 秒的 Sleeps 會平行執行。
Sleeps
real 0m2.245s
下一個範例:逾時。
作者 Mark McGranaghan 和 Eli Bendersky | 原始程式碼 | 授權