Skip to content

select

select 是一次性的!

select 的作用:

  • 多个 channel 同时等待
  • 超时控制
  • 主动取消
  • 协程调度友好

“我同时等这几件事,只要有一件能立刻做,我就做它。”

go
select {
case v := <-ch1:
    // ch1 有数据
case ch2 <- x:
    // ch2 可以发送
case <-time.After(time.Second):
    // 超时
}

ch1 接受到值就执行后面的

ch2 是当 x 发送成功,就执行后面的

time.After(time.Second) 是go 的API

elect 只关心“是否会阻塞”
如果所有 case 都会阻塞, 整个 select 阻塞

重复 select

go
for {
    select {
    case v, ok := <-ch:
        if !ok {
            fmt.Println("channel 关闭,退出")
            return
        }
        fmt.Println(v)
    }
}