CodeFun Go

Select 语句

select 语句使一个 Go 协程可以等待多个通道操作。

select 语句类似于 switch 语句,不同之处在于 select 中的每个 case 语句都等待来自通道的发送或接收操作。

对于 select 语句你需要知道一下两点:

  • select 会阻塞运行,直到任何 case 语句准备就绪。
  • 如果有多个 case 语句准备好,那么它会随机选择一个并继续。

在示例中,我们使用 time.Sleep(n * time.Second) 来模拟协程的运行时间。

package main

import (
	"fmt"
	"time"
)

func main() {
    ch1 := make(chan int)
	ch2 := make(chan int)

    go func() {
		time.Sleep(1 * time.Second)
        ch1 <- 1
    }()

	go func() {
		time.Sleep(2 * time.Second)
        ch2 <- 2
    }()

	select {
	case <-ch1:
		fmt.Println("ch1 received")
	case <-ch2:
		fmt.Println("ch2 received")
	}
}
ch1 received