【go语言】select多路选择

本文介绍了Go语言中select关键字在并发编程中的应用,包括处理通道操作、超时控制以及使用Context进行任务取消。作者详细解释了select语句的语法和行为,以及如何结合Context来管理请求截止日期和取消信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 可执行,执行这里
}

特性: 

  1. 如果多个 case 同时满足条件,Go 会随机选择一个执行。
  2. 如果没有 case 可以执行,且存在 default 分支,则执行 default
  3. 如果没有 default 分支,select 会阻塞,直到至少有一个 case 可执行。
  4. select 可以和 for 循环一起使用,用于不断地处理通道操作。

select 的主要用途是处理并发编程中的多个通道操作,例如处理超时、非阻塞通信等场景。

1. 超时控制

超时会比程序请求失败还可怕,为了避免主线程阻塞可以在select中设置超时中断。

示例代码如下:通过多路选择等待任务完成,如果超时就直接执行其他的处理程序

package main

import (
	"fmt"
	"time"
)

// 超时控制
func main() {
	select {
	case re := <-AsynService():
		fmt.Print("任务完成", re)
	case <-time.After(time
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值