看范例学 Golang (二十七)- Select

Select

Go 语言中的 select 可以让你同时处理多个 channel 。 结合 goroutine 、 channel 使用 select 能更好的发挥 Go 语言的能力。

package main
import "time"
import "fmt"
func main() {

在这个例子中我们会操作两个 channel 。

    c1 := make(chan string)
    c2 := make(chan string)

每一个 channel 都将会在一段时候后收到一个值,用以模拟,在并发情况下进行 RPC 调用的操作。

    go func() {
        time.Sleep(time.Second * 1)
        c1 <- "one"
    }()
    go func() {
        time.Sleep(time.Second * 2)
        c2 <- "two"
    }()

我们使用 select 去等待并获取返回值,然后打印它们。

    for i := 0; i < 2; i++ {
        select {
        case msg1 := <-c1:
            fmt.Println("received", msg1)
        case msg2 := <-c2:
            fmt.Println("received", msg2)
        }
    }
}

正如我们期望的那样,我们先接收到了值 "one" 然后是 "two"

$ time go run select.go
received one
received two

需要注意的是,执行的总时间大约是 2 秒,所以可知 goroutine 是并发执行的。

real	0m2.245s