go channel select 语句使用

devtools/2024/11/18 15:25:53/

在 Go 语言中,select 语句用于在多个通道操作中进行选择。它的工作机制类似于 switch 语句,但专门用于处理通道操作。select 语句可以同时等待多个通道操作,并在其中一个通道准备好时执行相应的分支。

select 的基本用法
以下是 select 的基本语法:

select {
case val1 := <-ch1:
    // 当 ch1 有数据时执行的代码
case ch2 <- val2:
    // 当可以向 ch2 发送数据时执行的代码
default:
    // 当没有通道准备好时执行的代码
}
 

使用场景
1.多通道接收:
可以同时等待多个通道的数据,并在其中一个通道有数据时进行处理。


2.通道发送:
可以同时尝试向多个通道发送数据,并在其中一个通道可以发送时执行操作。


3.超时处理:
可以结合 time.After 实现超时逻辑。


4.非阻塞操作:
使用 default 分支可以实现非阻塞的通道操作。

package main

import (
    "fmt"
    "time"
)

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)

    go func() {
        time.Sleep(2 * time.Second)
        ch1 <- "来自 ch1 的数据"
    }()

    go func() {
        time.Sleep(1 * time.Second)
        ch2 <- "来自 ch2 的数据"
    }()

    for i := 0; i < 2; i++ {
        select {
        case msg1 := <-ch1:
            fmt.Println(msg1)
        case msg2 := <-ch2:
            fmt.Println(msg2)
        case <-time.After(3 * time.Second):
            fmt.Println("超时")
        }
    }
}
 

关键点
随机选择:
如果多个通道同时准备好,select 会随机选择一个执行。


无阻塞的 default:
如果所有通道都没有准备好且存在 default 分支,select 会执行 default 分支而不会阻塞。


用于处理超时:
select 可以与 time.After 搭配使用,以处理通道操作的超时情况。


使用 select 可以让你的程序更高效地处理并发任务,尤其是在需要处理多个通道的复杂场景中


http://www.ppmy.cn/devtools/134979.html

相关文章

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 PS C:\WINDOWS\system32> get-ExecutionPolicy Restricted…

20241115在飞凌的OK3588-C的核心板上跑Linux R4时拿大文件到电脑的方法

20241115在飞凌的OK3588-C的核心板上跑Linux R4时拿大文件到电脑的方法 2024/11/15 15:26 缘起&#xff1a;使用SONY 405的机芯&#xff0c;以1080p60录像了半小时&#xff0c;3.5GB的mp4视频要拿到电脑上播放确认。 方法&#xff1a;1、拷贝到TF卡。记住&#xff0c;对于FAT32…

lab2:docker基础实战

一、实验目的 1.通过本次实验&#xff0c;完成Docker主机的安装和配置、镜像的搜索和下载、容器生命周期的基本管理、容器网络的管理。 2.通过Dockerfile来构建nginx镜像&#xff0c;了解Dockerfile镜像构建过程。 二、实验内容与实验要求 1.完成Docker的安装和配置。 2.完…

动态内存管理(c语言)

我们通常开辟空间的方式 int val 20; //大小为4个字节 char arr[10] {0} //开辟出一块连续的空间且大小为10 但是上面开辟空间方式的特点 1.空间开辟大小是固定的 2.数组在声明得时候&#xff0c;必须指定数组得长度&#xff0c;它所需要得内存在编译时分配 但是以上的方式不能…

【Ubuntu侧边菜单点击没反应】【Ubuntu 20.04】【浏览器、文件夹点击没反应】

在Ubuntu服务器上&#xff0c;出现左侧菜单栏&#xff08;如浏览器、文件资源管理器等&#xff09;点击无反应的问题&#xff0c;通常是由于桌面环境&#xff08;如GNOME&#xff09;出现了异常&#xff0c;可能是由于资源消耗过高、图形驱动问题、或者某些后台进程挂起等原因导…

哈希表学习分享

1.哈希表介绍 //1.介绍哈希表unordered_map<int, int>map;//unordered_map是不按照键值排序的 &#xff08;使用头文件unordered_map&#xff09;/*unordered_map<int, int>其中的第一个int代表的是键&#xff0c;第二个int代表的是值所以称为键值对&#xff0c;以…

11.13机器学习_KNN和模型选择调优

7 特征降维 实际数据中,有时候特征很多,会增加计算量,降维就是去掉一些特征,或者转化多个特征为少量个特征 特征降维其目的:是减少数据集的维度&#xff0c;同时尽可能保留数据的重要信息。 特征降维的好处: 减少计算成本&#xff1a;在高维空间中处理数据可能非常耗时且计…

【GeekBand】C++设计模式笔记13_Flyweight_享元模式

1. “对象性能” 模式 面向对象很好地解决了 “抽象” 的问题&#xff0c;但是必不可免地要付出一定的代价。对于通常情况来讲&#xff0c;面向对象的成本大都可以忽略不计。但是某些情况&#xff0c;面向对象所带来的成本必须谨慎处理。典型模式 SingletonFlyweight 2. Fly…