极简的go语言channel入门

news2025/4/12 14:17:43

写在文章开头

很久没写go语言相关的文章了,近期准备整理整理go语言channel相关的知识点,而本文将通过几个示例快速带读者了解channel的基本概念,希望对你有帮助。

在这里插入图片描述

Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护者之一,熟悉 Java 也会一点 Go ,偶尔也会在 C源码 边缘徘徊。写过很多有意思的技术博客,也还在研究并输出技术的路上,希望我的文章对你有帮助,非常欢迎你关注我的公众号: 写代码的SharkChili

因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

在这里插入图片描述

快速入门go语言channel基本概念

channel基础使用示例

作为一个java开发,笔者经常将channel的概念和阻塞队列进行关联,只不过两者在细节和理念上有些许区别,这里笔者先给出一个channel的基础示例,我们会往一个长度为1的channel中投递数据,然后从channel中取出数据并打印:

在这里插入图片描述

对应的代码如下所示,最终输出结果为:2024/08/31 10:07:22 receive data from the channel: hello world:

func main() {
	//声明一个channel,长度为1
	ch := make(chan string, 1)
	//往channel中投递数据
	ch <- "hello world"
	//取出channel数据
	s := <-ch
	//输出结果
	log.Println("receive data from the channel:", s)

}

channel基础语法介绍

这里通过一个简单的示例了解的channel的使用,基于此示例我们进行一下语法拓展,如上所示,本质上channel的创建语法有两种:
第一种是make(chan type)这种就是所谓的无缓冲channel,这意味着投递到channel没有任何缓冲区,数据必须被即使处理掉才能投递新新数据:

在这里插入图片描述

对此我们再给出上一个代码的示例进行改造,将size去掉,这就是无缓冲channel的声明示例,运行时抛出了 all goroutines are asleep - deadlock!,很明显,因为无缓冲区的原因导致投递到channel的数据必须即使被消费,导致当前协程投递之后就无法往后走进而休眠,最终导致了死锁:

func main() {
	//声明一个无缓冲区channel
	ch := make(chan string)
	//往channel中投递数据
	ch <- "hello world"
	//取出channel数据
	s := <-ch
	//输出结果
	log.Println("receive data from the channel:", s)

}

channel的第二种语法就是我们最开始示例的有缓冲区channel,对应语法为make(chan type, size),需要注意的是如果size设置为0,那么channel仍然是个无缓冲区channel
接下来再说说channel数据的存取语法,如上文代码示例所示,对于存取go语言统一使用"<-",符号的左边即箭头所指向的就是消费者,右边是生产者,例如我们要往channel中投递数据,那么channel就是消费者,而我们的业务就是生产者,对应格式为:

channel<-data

相反,如果我们希望从channel中读取数据,那么我们的协程就是消费者,而channel就是生产者,那么语法就是反过来:

data<-channel

最后再说明一个特殊情况,其实go语言是支持丢弃channel数据的,还是以上述逻辑进行推理,因为我们要丢弃channel数据,那么channel就是生产者,因为数据要被丢弃,所以消费者为空,对应的语法为:

<-channel

channel主要解决什么问题

这里我们就来说明一下channelJava中阻塞队列不同的地方,按照go语言作者的设计理念,channel是用于解决一些并发中信号传递的,通过channel这个通信模型解耦协程间的通信,从而避免共享内存作为信号时协程竞争以及没必要的CPU资源占用。
举个共享内存的例子,我们现在有两个协程进行通信,协程1传到数字0时结束工作,按照共享内存的套路,我们会给协程1传入数字类型的指针,让协程1去轮询这个指针值的变化,直到数字变为1:

在这里插入图片描述

对此我们给出代码示例,可以看到主协程在休眠3s后修改sign的值,此时监听协程从sign的指针收到0值,由此退出循环。很明显这种做法会导致监听协程进行非必要的轮询进而消耗没必要的CPU资源,并且在高并发场景下为保证sign的并发有序,我们可能还需要通过各种互斥手段保护临界资源,这使得协程间的竞争开销变大,程序性能表现进一步降低:

func main() {
	//声明信号为1
	sign := 1

	//传入sign指针
	go listenCloseSignal(&sign)

	//休眠3s,修改sign的值
	time.Sleep(3 * time.Second)
	sign = 0

	time.Sleep(3 * time.Second)
	log.Println("execute over")
}

func listenCloseSignal(sign *int) {
	for true {
		if *sign == 0 {
			log.Println("close go routine")
			break
		}
	}
}

取而代之我们使用channel,此时监听协程没有收到数据时就处于休眠状态,等到channel有数据才会被唤醒,又避免了非必要的空轮询开销而协程竞争开销,同时还能解耦模块间的逻辑,更有利于代码的扩展性和维护性:

func main() {
	ch := make(chan int)

	//传入sign指针
	go listenCloseSignal(ch)
	time.Sleep(3 * time.Second)
	ch <- 0
	time.Sleep(3 * time.Second)
	log.Println("execute over")
}

func listenCloseSignal(ch chan int) {
	//监听channel的值
	sign := <-ch
	if sign == 0 {
		log.Println("close go routine")
	}
}

而这就是设计们一直强调的:

用通道的方式共享内存,而不是共享内存进行通信

小结

自此,我们通过几个简单的案例介绍了channel的使用和注意事项,希望对你有帮助。

我是 sharkchiliCSDN Java 领域博客专家开源项目—JavaGuide contributor,我想写一些有意思的东西,希望对你有帮助,如果你想实时收到我写的硬核的文章也欢迎你关注我的公众号: 写代码的SharkChili
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注 “加群” 即可和笔者和笔者的朋友们进行深入交流。

在这里插入图片描述

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

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

相关文章

Vue笔记总结(Xmind格式):第六天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; 动态组件 1.组件中name属性的作用 递归组件:一个组件要用自己的时候&#xff0c;可以通过自己的名字来使用自己。 2.组件缓存 组件切换会导致组件被频繁销毁和重新创建, 所以性能不高,Vue内置的keep-alive组件包起来要频繁切…

2024年(第7届)“泰迪杯”数据分析技能赛通知

由泰迪杯数据分析技能赛组织委员会、广东泰迪智能科技股份有限公司主办&#xff0c;广东省工业与应用数学学会、人民邮电出版社和北京泰迪云智信息技术研究院协办的“泰迪杯”数据分析技能赛&#xff08;以下简称竞赛&#xff09;即将开展。 竞赛目的在于以赛促学、以赛促教、…

企业架构的概念及发展历程简述(附TOGAF架构理论学习资料下载链接)

企业架构在数字化转型中发挥着至关重要的作用。它不仅确保了战略一致性、提高了运营效率、强化了信息安全&#xff0c;还指导了数字化转型路径、推动了技术与业务的深度融合以及促进了生态系统的连接。因此&#xff0c;在数字化转型过程中&#xff0c;企业应高度重视企业架构的…

2023年中国90后十大影响力人物

“2023年中国90后十大影响力人物” 2024年1月23日&#xff0c;揭晓了由网友投票评选的中国2023年90后十大影响力人物。

一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析

爱德华蒙克(Edvard Munch)的"蒙特卡洛赌场的轮盘桌"(1892) 蒙特卡洛方法的起源与发展 1945年&#xff0c;在第二次世界大战即将结束之际&#xff0c;一场看似简单的纸牌游戏引发了计算领域的重大突破。这项突破最终导致了蒙特卡洛方法的诞生。参与曼哈顿计划的科学…

day05 1.运算符重载

#include <iostream> #include <cstring> using namespace std;class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度public://无参构造myString():size(10){str new char[size]; //构造出一个长度为10的…

解除禁售!Ozon重新开放电子产品等品类销售,Ozon出单了怎么发货?

今年6月份&#xff0c;俄罗斯电商平台Ozon暂时关闭了电子产品、汽车配件和DIY工具三大品类&#xff0c;相关数据显示&#xff0c;有69%的电子产品是中国制造的&#xff0c;如耳机耳麦、充电器、智能手机、平板电脑、电子元器件等。这项禁售政策影响了众多卖家的销售业务&#x…

电赛2024年H题智能小车基于MSPM0G3507主控MCU(利用8路灰度加上MPU6050的解决方式)具体项目报告

题目&#xff1a;自动行驶小车&#xff08;H题&#xff09; 摘要 本项目由微处理器MSPM0G3507&#xff0c;编码器电机驱动&#xff0c;8路灰度传感器指示线巡线单元&#xff0c;MPU6050六轴传感器无线直行单元&#xff0c;OLED显示人机互动单元&#xff0c;红色LED及蜂鸣器声光…

Windows Server 2019 中文版、英文版下载 (updated Aug 2024)

Windows Server 2019 中文版、英文版下载 (updated Aug 2024) Windows Server 2019 Version 1809 请访问原文链接&#xff1a;https://sysin.org/blog/windows-server-2019/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 本站将不定期发布官方原版风格月度更…

springboot驾校预约管理系统—计算机毕业设计源码25540

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于驾校预约管理系统 当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了驾校预约管理系统 &#xff0c;它彻底改变了…

【C语言从不挂科到高绩点】08-作业练习-循环结构01

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程,前面课程中给大家讲解了一些常规的知识点,那么本次课,我们一起来练习挑战一下!! 本套课程将会从0基础讲解C语言核心技术,适合人群: 大学中开设了C语言课程的同学想要专升本或者考研的同…

knime安装 OCR识别节点Tess4J

Tess4J Node是一个工具&#xff0c;它把Tesseract OCR库整合到KNIME软件中。Tesseract OCR是一个光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;的库&#xff0c;可以将图片中的文字转换成电脑可以编辑的文本。 安装过程&#xff1a; 1、在knimeh…

免费ppt模板哪里找?AI智能生成指南分享

在忙碌的工作日常中&#xff0c;制作一份精美的ppt模板似乎成了一项艰巨的任务。 但别担心&#xff0c;其实掌握以下这个小技巧&#xff0c;就能让这个过程变得轻松又高效。想要让你的演示文稿在会议中脱颖而出吗&#xff1f;想要知道ppt模板怎么制作的吗&#xff1f;跟我一起…

终极解决 docker 拉取镜像失败的问题,其他类似场景也适用

国内的网络环境&#xff0c;想必大家都是知道的&#xff0c;虽说技术无罪&#xff0c;但奈何政策不允许啊&#xff0c;以下内容我在 CSDN 上发不了&#xff0c;请大家移步我的个人公 * 号&#xff1a;新质程序猿&#xff0c;查看更多原创内容&#xff0c;这里只介绍相关背景和需…

网站建设完成后, 做seo必须知道的专业知识之--蜘蛛陷阱

蜘蛛陷阱&#xff08;Spider Trap&#xff09;是指那些阻止搜索引擎蜘蛛程序&#xff08;即爬虫程序&#xff09;正常爬行和抓取网站内容的障碍物或策略。这些陷阱通常是由网站设计或技术上的某些特定元素造成的&#xff0c;它们对搜索引擎的友好度较低&#xff0c;不利于蜘蛛程…

Java-数据结构-链表-LinkedList(一) (^_−)☆

文本目录&#xff1a; ✿一、ArrayList的优点和缺陷&#xff1a; ✿二、链表&#xff1a; ❄️1、链表的概念与结构&#xff1a; ❄️2、单向不带头非循环链表的实现&#xff1a; ❄️&#xff08;1&#xff09;、操作&#xff1a; ▶display () 方法&#xff1a; ▶size…

5千多道安全生产证考试题库ACCESS\EXCEL数据库

安全生产是保护劳动者的安全、健康和国家财产&#xff0c;促进社会生产力发展的基本保证&#xff0c;也是保证社会主义经济发展&#xff0c;进一步实行改革开放的基本条件。因此&#xff0c;做好安全生产工作具有重要的意义。今天的数据即是安全生产资格证、许可证考试题库。 大…

传统管道,匿名管道

二、传统的进程间通信-管道文件 管道是UNIX系统中最古老的进程间通信技术&#xff0c;古老意味着所有系统都支持&#xff0c;早期的管道是半双工通信&#xff0c;现有的系统管道是全双工通信 管道就是一种特殊的文件&#xff0c;数据在文件中是流动的&#xff0c;读取之…

webshell绕过样本初体验

目录 一&#xff1a;前景 二&#xff1a;样本 样本一&#xff1a; 样本二&#xff1a; 样本三&#xff1a; 样本4&#xff1a; 样本5&#xff1a; 一&#xff1a;前景 在我们日常的网站中百分之一百是存在一些安全设备来拦截我们的webshell的&#xff0c;一般情况…

苹果手机微信恢复聊天记录分享:3个恢复方法,学到就是赚到

Q&#xff1a;我微信里面的聊天记录都不见了怎么办呀&#xff1f; A&#xff1a;问我你就是问对人了&#xff0c;我这里有3个超好用的微信恢复聊天记录的方法&#xff0c;不管你的聊天记录是被误删的&#xff0c;还是由于其他的原因导致丢失&#xff0c;在这3个方法中&#xf…