语法

  1. select {
  2. case i := <-ch1:
  3. // 通道1
  4. case i := <-ch2:
  5. // 通道2
  6. }

作用

通过 select 语句,可以同时响应多个通道的接收,在其他情况下,一个goroutine中同时响应多个通道的接收是困难的,顺序靠前的接收操作会先执行,如果发生阻塞,之后的通道接收都无法执行。

应用

超时控制

超时控制需要配合time包:

select {
case i := <-ch:
    // valid
case <-time.After(timeout):
    // timeout
}

通过select并发响应有效操作channel和超时channal,就可以方便地进行超时控制。

避免goroutine泄露

配合context包:

go func() {
    select {
    case i := <-ch:
        // valid
    case ctx.Done:
        // exit
        return
    }
}()