Golang中的Select语句有什么作用?

Select语句用于处理异步IO操作,它监听case语句中的IO操作,当某个IO操作就绪时执行对应的case语句。

select的基本形式是:

select {
    case communication clause  :
       statement(s);      
    case communication clause  :
       statement(s); 
    /* 可有任意数量的case */
    default : 
       statement(s);
}

例如:

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

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

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

    select {
    case msg1 := <-c1:
        fmt.Println("received", msg1)
    case msg2 := <-c2:
        fmt.Println("received", msg2)
    }
}

上述代码启动两个goroutine在1s和2s后分别发送数据到c1和c2通道。
select会监听c1和c2两个通道的操作,当其中一个通道发送数据并就绪时,立即执行对应case语句。
如果c1通道先就绪,则会打印:

received one

如果c2通道先就绪,则会打印:

received two

如果在1s内两个通道都没有就绪,select会阻塞等待,而不会执行default语句。
select的作用是处理异步IO操作并实现非阻塞的选择语句。它可以监听多个通信操作,当任意一个操作就绪时立即执行,这实现了一种非阻塞的选择机制。