news 2026/5/22 2:05:52

【go语言 | 第5篇】channel——多个goroutine之间通信

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【go语言 | 第5篇】channel——多个goroutine之间通信

文章目录

  • channel的定义和使用
  • channel——有缓冲和无缓冲同步
    • 1. 无缓冲的channel
    • 2. 有缓冲的channel
  • channel——关闭channel
  • channel 与 range
  • channel 与 select

channel的定义和使用

channel 用于多个 goroutine 之间的通信

packagemainimport"fmt"funcmain(){// 创建一个 channelc:=make(chanint)gofunc(){deferfmt.Println("goroutine结束!")fmt.Println("goroutine正在运行")// 将数据发送到 channel 中c<-100}()// 从 channel 中接收数据, 存入到 numnum:=<-c fmt.Println("num:",num)fmt.Println("main goroutine 结束")}

为什么 main goroutine 中的执行会在 子goroutine 之后?

(1)main go 已经到达 num := <- c 时,如果 channel 中还没有存在 c,就会对 main go 进行阻塞。
(2)sub go 已经到达 c <- 100,如果 main go 还没有到达 num := <- c,因为此时的管道 c 是无缓冲的,就会对 sub go 进行阻塞。

channel——有缓冲和无缓冲同步

1. 无缓冲的channel


(1)在第1步,两个goroutine都到达通道,但哪个都没有开始执行发送或者接收。
(2)在第2步,左侧的goroutine将它的手伸进了通道,这模拟了向通道发送数据的行为。这时,这个goroutine会在通道中被锁住,直到交换完成。
(3)在第3步,右侧的goroutine将它的手放入通道,这模拟了从通道里接收数据。这个goroutine一样也会在通道中被锁住,直到交换完成。
(4)在第4步和第5步,进行交换,并最终,在第6步,两个goroutine都将它们的手从通道里拿出来,这模拟了被锁住的goroutine得到释放。两个goroutine现在都可以去做其他事情了。

2. 有缓冲的channel

packagemainimport("fmt""time")funcmain(){// 创建一个容量为3的 channel(有缓冲的channel)c:=make(chanint,3)gofunc(){deferfmt.Println("子go程结束!")fori:=0;i<3;i++{c<-i fmt.Println("子go程 i = ",i," 元素个数:",len(c)," 元素个数:",cap(c))}}()time.Sleep(1*time.Second)fori:=0;i<3;i++{// 从 channel 中获取数据num:=<-c fmt.Println("num =",num)}fmt.Println("main goroutine 运行结束")}



(1)在第1步,右侧的goroutine正在从通道接收一个值。
(2)在第2步,右侧的这个goroutine独立完成了接收值的动作,而左侧的goroutine正在发送一个新值到通道里。
(3)在第3步,左侧的goroutine还在向通道发送新值,而右侧的goroutine正在从通道接收另外一个值。这个步骤里的两个操作既不是同步的,也不会互相阻塞。
(4)最后,在第4步,所有的发送和接收都完成,而通道里还有几个值,也有一些空间可以存更多的值。

channel——关闭channel

packagemainimport"fmt"funcmain(){c:=make(chanint)gofunc(){fori:=0;i<3;i++{c<-i}// close 关闭 channelclose(c)}()for{// ok 为 true 表示 channel 没有关闭, ok 为 false 表示 channel 已经关闭ifdata,ok:=<-c;ok{fmt.Println("data: ",data)}else{break}}fmt.Println("main goroutine 结束")}


(1)channel不像文件一样需要经常去关闭,只有当你确实没有任何发送数据了,或者想显式的结束range循环之类的,才去关闭channel;
(2)关闭channel后,无法向channel再发送数据(引发panic错误后导致接收立即返回零值);
(3)关闭channel后,可以继续从channel接收数据;
(4)对于nil channel,无论收发都会被阻塞。

channel 与 range

packagemainimport"fmt"funcmain(){c:=make(chanint)gofunc(){fori:=0;i<3;i++{c<-i}// close 关闭 channelclose(c)}()/* for { // ok 为 true 表示 channel 没有关闭, ok 为 false 表示 channel 已经关闭 if data, ok := <- c; ok { fmt.Println("data: ", data) } else { break } } */// 可以使用 range 代替不断迭代的操作的cahnnelfordata:=rangec{fmt.Println("data: ",data)}fmt.Println("main goroutine 结束")}

channel 与 select

单流程下,一个go只能监控一个 channel 状态,select可以完成监控多个 channel的状态。

packagemainimport("fmt")funcmethod(c,quitchanint){x,y:=1,1for{select{casec<-x:// 如果 c 可写入,执行下面x=y y=x+ycase<-quit:fmt.Println("quit.....")return}}}funcmain(){c:=make(chanint)quit:=make(chanint)gofunc(){fori:=0;i<6;i++{fmt.Println(<-c)}quit<-0}()method(c,quit)}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 14:48:28

模型推理加速技术全景解析:从基础优化到前沿创新

在2024-2025年间&#xff0c;大模型推理加速技术取得了显著突破&#xff0c;从传统的模型压缩到前沿的分页内存管理&#xff0c;再到革命性的投机解码&#xff0c;这些技术共同推动了大模型推理速度的质的飞跃。本报告将深入浅出地解析这些主流加速手段&#xff0c;结合一年内发…

作者头像 李华
网站建设 2026/5/19 18:27:46

LobeChat公益活动策划方案生成

LobeChat 公益应用技术实践&#xff1a;让AI真正服务于人 在偏远山区的乡村小学里&#xff0c;一个孩子低声说&#xff1a;“我不想上学了。” 没有老师在场&#xff0c;也没有心理咨询师能立刻赶到——但屏幕另一端的AI助手听到了这句话。它没有机械地回答“为什么呢&#xf…

作者头像 李华
网站建设 2026/5/14 2:38:15

LobeChat智能排班建议生成算法初探

LobeChat智能排班建议生成算法初探 在人力资源管理日益智能化的今天&#xff0c;一个看似简单却极其耗时的任务——排班&#xff0c;正成为企业效率提升的关键瓶颈。尤其在医疗、零售、客服中心等需要轮班作业的行业中&#xff0c;管理者常常面临这样的困境&#xff1a;既要满足…

作者头像 李华
网站建设 2026/5/11 5:35:35

10.3 当前挑战:标准化、模型保密性、系统规划

10.3 当前挑战:标准化、模型保密性、系统规划 构网型变流器的技术验证与初步工程应用已证明了其在提升新型电力系统稳定性方面的核心价值。然而,其从“可用”到“可靠、可管、可大规模部署”的广泛普及,仍面临来自技术规范、商业生态和系统设计方法三个维度的深层次挑战。本…

作者头像 李华
网站建设 2026/5/19 4:37:29

互联网大厂Java求职者面试实录:严肃面试官与搞笑谢飞机的三轮问答

互联网大厂Java求职者面试实录&#xff1a;严肃面试官与搞笑谢飞机的三轮问答 本文通过一个互联网大厂Java求职面试的故事场景&#xff0c;展现了面试官与求职者谢飞机之间的精彩问答。面试涉及Java核心知识、JUC、JVM、多线程、线程池、HashMap、ArrayList、Spring、SpringBoo…

作者头像 李华
网站建设 2026/5/20 10:25:07

提示词工程完全指南:从零开始掌握大模型交互核心技术

本文详细介绍提示词工程这一优化大模型的核心技术&#xff0c;包括基本概念、构成要素及多种使用示例&#xff08;文本总结、信息提取、逻辑推理等&#xff09;。深入解析零样本提示、少样本提示、链式思考、自我一致性和思维树等进阶调优技巧&#xff0c;并探讨Prompt攻击与防…

作者头像 李华