select基础知识
select
是 Go 语言中用于处理通道操作的控制结构,它类似于 switch
语句,但专门用于通道的选择。select
语句使得一个 goroutine 可以等待多个通道操作,当其中任意一个通道操作可以进行时,就会执行相应的 case
分支。
select语句语法如下:
select {
case channel1 <- value1:
// 如果 channel1 可以写入,执行这里
case value2 := <-channel2:
// 如果 channel2 可以读取,执行这里
case value3, ok := <-channel3:
// 如果 channel3 被关闭,并且有数据可读,执行这里
case <-time.After(time.Second):
// 在超时时间内没有任何 case 可执行,执行这里
default:
// 如果没有任何 case 可执行,执行这里
}
特性:
- 如果多个
case
同时满足条件,Go 会随机选择一个执行。 - 如果没有
case
可以执行,且存在default
分支,则执行default
。 - 如果没有
default
分支,select
会阻塞,直到至少有一个case
可执行。 select
可以和for
循环一起使用,用于不断地处理通道操作。
select
的主要用途是处理并发编程中的多个通道操作,例如处理超时、非阻塞通信等场景。
1. 超时控制
超时会比程序请求失败还可怕,为了避免主线程阻塞可以在select中设置超时中断。
示例代码如下:通过多路选择等待任务完成,如果超时就直接执行其他的处理程序
package main
import (
"fmt"
"time"
)
// 超时控制
func main() {
select {
case re := <-AsynService():
fmt.Print("任务完成", re)
case <-time.After(time