Golang select 的用法代码示范

25 min read

以下是一个简单的示例代码,演示了如何使用 Go 语言的 select 关键字:

package main

import (
    "fmt"
    "time"
)

func main() {
    c1 := make(chan int)
    c2 := make(chan int)

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

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

    select {
    case n := <-c1:
        fmt.Println("Received from c1:", n)
    case n := <-c2:
        fmt.Println("Received from c2:", n)
    case <-time.After(3 * time.Second):
        fmt.Println("Timeout")
    }
}

在这个示例中,我们创建了两个无缓冲的通道 c1c2,并创建了两个协程,每个协程在一段时间后向通道发送一个整数值。

main 函数中,我们使用了 select 关键字来等待这两个通道的数据,直到其中一个通道有数据可读时,就会执行对应的 case 分支。如果 select 在指定的时间内都没有收到任何数据,那么就会执行 default 分支。

在本示例中,我们设置了一个超时时间为 3 秒,如果在这个时间内还没有数据可用,就会输出 "Timeout"。因为 c1c2 中的数据会在 1 秒和 2 秒后才会发送,所以最终输出的是 "Received from c1: 10"。