Golang基础-- select的用法

发布时间 2023-04-09 22:36:34作者: 99号的格调

select是golang在语言层面提供的多路IO复用的机制,其可以检测多个channel是否ready

三个题目示例来说明一下select的大概作用:

题目一:

声明两个channel,分别为chan1chan2,依次启动两个协程,分别向两个channel中写入一个数据就进入 睡眠。select语句两个case分别检测chan1chan2是否可读,如果都不可读则执行default语句。

import (
    "fmt"
    "time"
)

func main() {
    chan1 := make(chan int)
    chan2 := make(chan int)

    go func() {

        chan1 <- 1
        time.Sleep(time.Second * 10)
    }()

    go func() {

        chan2 <- 2
        //time.Sleep(time.Second)
    }()

    select {
    case <-chan1:
        fmt.Println("channel1 ready")

    case <-chan2:
        fmt.Println("channel2 ready")
    default:
        fmt.Println("default")
    }

    fmt.Println("main exit")
}

select中各个case执行顺序是随机的,如果某个case中的channel已经ready,则执行相应的语句并退 出select流程,如果所有case中的channel都未ready,则执行default中的语句然后退出select流程。另外, 由于启动的协程和select语句并不能保证执行顺序,所以也有可能select执行时协程还未向channel中写入数据, 所以select直接执行default语句并退出。