golang通道(chan)选择(select)与关闭(close)使用示例

1.通道选择

创建两个双向通道

c1 := make(chan string) //双向通道
c2 := make(chan string) //双向通道

向通道写入数据 

//协程1向通道1写数据go func() { c1 <- "hello world from c1" }()//协程2向通道2写数据go func() { c2 <- "hello world from c2" }()

遍历所有通道读取数据 

//遍历通道并选择对应通道操作for i := 0; i < 2; i++ {select {case recv1 := <-c1: //选择通道1fmt.Println("接收通道1数据:", recv1)case recv2 := <-c2: //选择通道2fmt.Println("接收通道2数据:", recv2)}}

通道超时处理:使用time.After为写入条件

//单通道超时操作go func() {time.Sleep(2 * time.Second) //休眠2秒,使通道超时有效c1 <- "===再次向通道c1写入数据==="}()select {case msg := <-c1:fmt.Println("接收通道1数据:", msg)case <-time.After(1 * time.Second): //通道操作超时fmt.Println("通道操作超时")}
非阻塞通道操作:
//非阻塞通道操作message := make(chan string)  //处理字符串的通道signalChan := make(chan bool) //处理布尔类型的通道//不阻塞处理message通道select {case msg := <-message: //接收fmt.Println("接收message通道消息:", msg)default:fmt.Println("message:没有要处理的消息")}//向通道发送消息msgSend := "这是向通道发送的消息"select {case message <- msgSend: //发送fmt.Println("成功向message通道发送消息", msgSend)default:fmt.Println("没有要向message通道发送的消息")}//不阻塞处理signalChan通道select {case msg := <-signalChan:fmt.Println("signalChan:处理消息:", msg)default:fmt.Println("signalChan:没有要处理的消息")}//向signalChan通道发送消息select {case signalChan <- true:fmt.Println("成功向通道signalChan发送消息", <-signalChan)default:fmt.Println("没有要向signalChan通道发送的消息")}go func() { message <- "msg for channel message" }()go func() { signalChan <- false }()fmt.Println(cap(message), len(message), cap(signalChan), len(signalChan))time.Sleep(1 * time.Second)//接收多通道消息,随机处理message/signalChan通道select {case mul_msg := <-message:fmt.Println("===>接收message通道消息:", mul_msg)case mul_sig := <-signalChan:fmt.Println("===>接收signalChan通道消息", mul_sig)default:fmt.Println("无通信活动")}

关闭通道处理:

//关闭通道测试jobs := make(chan int, 5) //通道缓存5条消息finish := make(chan bool) //任务完成状态//启动一个协程go func() {fmt.Println("协程已启动...")fmt.Println("jobs通道大小:", len(jobs), "容量:", cap(jobs))for {valueInChannel, getValueOK := <-jobs //取通道消息if getValueOK {fmt.Println(">>>从通道中读取的值:", valueInChannel)} else {fmt.Println("任务完成!") //调用close来关闭通道后,才会执行到这里finish <- truereturn}}}()//向通道插入5条消息for i := 0; i < 5; i++ {jobs <- (i + 1) * 5 //插入消息}fmt.Println("所有任务发送完成!!!")//关闭通道close(jobs)<-finish_, ok := <-jobs //再次读取通道数据if !ok {fmt.Println("所有任务已完成,通道无任何数据!", len(jobs), len(finish))}fmt.Println(ok)time.Sleep(time.Second * 1) //休眠1秒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/23887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【递归、搜索与回溯】递归算法

一、经验总结 递归 VS 迭代&#xff08;循环&#xff09; 递归和迭代都解决的是重复的子问题&#xff0c;因此两者是可以相互转化的。利用栈结构可以将递归算法转化为迭代算法。 递归和迭代各有其优缺点&#xff0c;选择时需根据具体场景和需求来决定。 递归的优点包括&#…

苹果眼镜(Vision Pro)专业咨询服务模式优化方案

一、精准定位&#xff1a; 专注于为Apple Vision Pro应用开发者提供一站式、全方位的专业咨询服务&#xff0c;致力于成为开发者在空间计算时代中不可或缺的合作伙伴&#xff0c;共同打造“下一个大事件”。 二、核心业务优化&#xff1a; visionOS策略咨询&#xff1a; 深入…

【氵】Archlinux+KDE Plasma+Wayland 安装nvidia驱动 / 开启HDR

参考: NVIDIA - Arch Linux 中文维基 &#xff08;其实就是把 wiki 简化了一下 注&#xff1a;本教程适用 GeForce 930 起、10 系至 20 系、 Quadro / Tesla / Tegra K-系列以及更新的显卡&#xff08;NV110 以及更新的显卡家族&#xff09;&#xff0c;此处以 RTX3060 为例 …

LlamIndex二 RAG应用开发

在AutoGen)系列后&#xff0c;我又开始了LlamIndex 系列。欢迎查询LlamaIndex 一 简单文档查询 - 掘金 (juejin.cn)了解LlamIndex&#xff0c;今天我们来看看LlamIndex的拿手戏&#xff0c;RAG应用开发。 何为RAG&#xff1f; RAG全称"Retrieval-Augmented Generation&q…

MySQL之创建高性能的索引和查询性能优化(一)

创建高性能的索引 减少索引和数据的碎片 B-Tree索引可能会碎片化&#xff0c;这会降低查询的效率。碎片化的索引可能会以很差或者无序的方式存储在磁盘上。根据设计&#xff0c;B-Tree需要随机磁盘访问才能定位到叶子页&#xff0c;所以随机访问是不可避免地。然而&#xff0…

大田作业全覆盖算法

概述 大田作业全覆盖算法是指在农业生产中&#xff0c;通过合理的路径规划和作业安排&#xff0c;实现对田间作业的全覆盖&#xff0c;避免遗漏任何区域&#xff0c;提高作业效率和质量。该算法通常用于农业机械&#xff0c;如拖拉机、无人机、自动化农机等。以下是实现大田作…

vue处理json数据

背景&#xff1a;后端返回的数据不是我想要的&#xff0c;现在需要把 name 替换为title&#xff08;小声蛐蛐&#xff1a;又让我处理数据&#xff09; 后端返回数据格式 修改字段操作&#xff1a;&#xff08;使用递归遍历的方式将title属性赋了name的值&#xff09; renderT…

shell脚本对编码和行尾符敏感吗

问题 我正在 macOS 上制作一个 NW.js 应用程序&#xff0c;并想通过双击图标在开发模式下运行该应用程序。在第一步中&#xff0c;我试图使我的 shell 脚本正常工作。 在 Windows 上使用 VS Code&#xff0c;我在项目的根目录下创建了一个 run-nw 文件&#xff0c;包含以下内…

详细分析Mysql临时变量的基本知识(附Demo)

目录 前言1. 用户变量2. 会话变量 前言 临时变量主要分为用户变量和会话变量 1. 用户变量 用户变量是特定于会话的&#xff0c;在单个会话内可以在多个语句中共享 以 符号开头在 SQL 语句中使用 SET 语句或直接在查询中赋值 声明和赋值 SET var_name value; -- 或者 SE…

深耕低代码,技术赋能企业转型业务

随着信息化时代的飞速发展&#xff0c;企业对于数字化转型的需求日益迫切。在这个背景下&#xff0c;低代码技术应运而生&#xff0c;为企业提供了一种更加高效、灵活的业务解决方案。本文将围绕“深耕低代码&#xff0c;技术赋能企业转型业务”这一主题&#xff0c;深入探讨低…

构建Vue3项目的几种方式,如何简化setup写法

1、说明 在vue2版本中&#xff0c;我们使用vue-cli脚手架进行构建&#xff0c;而切换到Vue3之后&#xff0c;依然可以使用vue-cli脚手架进行构建&#xff0c;但是官方推荐使用vite工具进行构建&#xff0c;下面将介绍几种方式构建vue3项目。 2、使用vue-cli脚手架构建Vue3项目…

使用Service Worker、Web Workers进行地图渲染优化

地图的渲染涉及到大量的dom&#xff0c; 如果每次地图重渲染都操作dom将会照成很大的性能开销&#xff0c;下面总结两个方案来开发和优化离线地图&#xff0c;以提升地图操作的流畅性和性能&#xff1a; 方案一&#xff1a;使用Service Worker和离线缓存 利用Service Worker技…

180. 连续出现的数字

180. 连续出现的数字 题目链接&#xff1a;180. 连续出现的数字 代码如下&#xff1a; # Write your MySQL query statement below select distinct l1.num as ConsecutiveNums fromLogs as l1,Logs as l2,Logs as l3 wherel1.idl2.id-1and l2.idl3.id-1and l1.numl2.numand …

【前端面试高频手写题】

# 面试高频手写题 建议优先掌握&#xff1a; instanceof - 考察对原型链的理解 new - 对创建对象实例过程的理解 call/apply/bind - 对this指向的理解 手写promise - 对异步的理解手写原生ajax - 对ajax原理和http请求方式的理解&#xff0c;重点是get和post请求的实现 # 1…

15、数据资产评估指导意见

第一章 总则 第一条 为规范数据资产评估行为,保护资产评估当事人合法权益和公共利益,根据《资产评估基本准则》及其他相关资产评估准则,制定本指导意见。 第二条 本指导意见所称数据资产,是指特定主体合法拥有或者控制的, 能进行货币计量的,且能带来直接或者间接经济利…

在vue项目中实现单点登录

核心依赖版本&#xff0c;vue3.4.x&#xff0c;vue-router4.3.x。 由于vue项目一般都是前后端分离的&#xff0c;所以这里单点的跳转需要在vue中处理。 一开始考虑将单点跳转做在后端&#xff0c;但那样感觉又将前后端强耦合了起来&#xff0c;所以最终还是决定将单点认证的跳转…

excel的XLOOKUP的快速多列关联查询

我们前几章上面介绍了&#xff0c;根据某国产品牌官网介绍的使用&连接来进行多列关联查询&#xff0c;非常的慢。有没有公式可以快速进行XLOOKUP多列关联查询&#xff0c;我们找到了一个速度还可以的办法。 原理&#xff1a;有几列需要关联查询&#xff0c;我们就写几个XLO…

高考填报志愿,怎么分析自己适合什么专业?

高考结束后&#xff0c;很多考生不知道自己的分数段适合什么学校&#xff0c;缺乏目标感&#xff0c;有些专业名称很大&#xff0c;听起来光鲜亮丽&#xff0c;但是是否适合自己&#xff0c;学什么课程&#xff0c;将来就业去向&#xff0c;这些都是需要细致了解的。 专业选择…

matlab 异常值检测与处理——Z-score法

目录 一、算法原理1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法概述 使用Z分数法,可以找出距离平均值有多少个标准差值…

提高篇(八):扩展Processing功能:从库使用到跨平台应用

提高篇(八):扩展Processing功能:从库使用到跨平台应用 引言 Processing是一款强大的创意编程工具,广泛应用于艺术、设计和教育等领域。但其真正的魅力在于其可扩展性:你可以通过使用各种扩展库、结合其他编程语言、在不同硬件平台上应用,甚至创建自己的扩展库来丰富Pro…