语法
select {
case i := <-ch1:
// 通道1
case i := <-ch2:
// 通道2
}
作用
通过 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
}
}()