GO_并发编程---channel
前置回顾Go 并发核心设计理念不要通过共享内存来通信而要通过通信来共享内存goroutine之间数据同步、数据交互统一依靠channel实现解决多协程资源竞争问题。一、Channel 基础概念作用实现多个 goroutine 同步协程之间安全共享、传递数据底层理解可以把 channel 看作一根管道 / 水管两端分别对应发送、接收无缓存管道一端没就绪另一端会阻塞有缓存管道缓冲区存数据缓冲区满 / 空时发生阻塞。传递特性channel 本身是地址传递引用类型不是值传递。二、Channel 创建语法使用内置函数make创建分两种go// 1. 无缓冲通道容量为0 ch : make(chan 数据类型) ch : make(chan int, 0) // 2. 有缓冲通道capacity代表缓冲区最大存储数量 ch : make(chan string, 5)三、Channel 收发操作符--是通道专属操作符四种常用写法go// 1. 发送数据把value写入通道 channel - value // 2. 接收数据直接丢弃不保存 -channel // 3. 接收数据赋值给变量x x : -channel // 4. 接收判断通道状态重点 // oktrue通道未关闭正常读到数据 // okfalse通道已关闭无数据可读 x, ok : -channel阻塞规则通道无数据可读时接收操作阻塞无缓冲通道、缓冲区已满的有缓冲通道发送操作阻塞。四、无缓冲 Channel同步通道定义创建时容量为 0缓冲区无法存储任何数据。核心特性发送和接收必须同时就绪否则阻塞先执行发送ch - val阻塞等待其他协程接收先执行接收-ch阻塞等待其他协程发送只有收发双方同时到位数据才会完成传递协程继续向下执行。示例 1利用无缓冲通道实现协程同步gopackage main import fmt // 全局通道 var ch make(chan int) func Printer(str string) { for _, v : range str { fmt.Print(string(v)) } fmt.Println() } func person1() { Printer(hello) ch - 666 // 发送数据通知person1执行完毕 } func person2() { -ch // 阻塞等待收到数据后才执行打印 Printer(world) } func main() { go person1() go person2() for {} // 阻塞主协程防止程序退出 }执行顺序固定hello先打印再打印world实现协程同步。示例 2无缓冲通道完整读写演示gopackage main import ( fmt time ) func main() { // 无缓冲通道 ch : make(chan int, 0) fmt.Printf(len(ch)%d, cap(ch)%d\n, len(ch), cap(ch)) // 子协程发送数据 go func() { for i : 0; i 3; i { fmt.Println(子协程 i , i) ch - i // 无缓冲会阻塞等待主协程读取 } }() time.Sleep(2 * time.Second) // 主协程循环读取 for i : 0; i 3; i { num : -ch fmt.Println(num , num) } }五、有缓冲 Channel异步通道定义创建时指定容量 capacity内部自带缓冲区可以预先存储多条数据。go// 缓冲区最多存3个int ch : make(chan int, 3)核心特性缓冲区未满发送数据不会阻塞直接存入缓冲区缓冲区已满发送操作阻塞等待其他协程读取腾出空间缓冲区有数据接收操作直接读取不阻塞缓冲区为空接收操作阻塞。示例有缓冲通道读写gopackage main import ( fmt time ) func main() { ch : make(chan int, 3) go func() { for i : 0; i 3; i { ch - i fmt.Printf(子协程[%d] len(ch)%d, cap(ch)3\n, i, len(ch)) } }() time.Sleep(2 * time.Second) for i : 0; i 3; i { num : -ch fmt.Println(num , num) } }六、关闭 Channel close ()使用场景确认后续不会再向通道发送数据时调用close(ch)关闭通道。重要规则关闭后的通道禁止发送数据发送会直接 panic 崩溃通道关闭后缓冲区剩余数据仍可正常读取缓冲区数据全部读完后再次读取会返回okfalse。方式 1if 判断 ok 读取通道gopackage main import fmt func main() { ch : make(chan int) go func() { for i : 0; i 5; i { ch - i } close(ch) // 写完数据关闭通道 }() for { num, ok : -ch if ok true { fmt.Println(num , num) } else { fmt.Println(通道已关闭退出循环) break } } }方式 2range 遍历通道推荐for range会自动循环读取通道数据通道关闭后自动结束循环无需手动判断 okgofor num : range ch { fmt.Println(num , num) }七、单向 Channel只读 / 只写通道语法区分箭头方向go// 双向通道可读可写默认 var ch chan int // 只写通道chan-只能发送数据不能读取 var writeCh chan- float64 // 只读通道-chan只能读取数据不能发送 var readCh -chan int转换规则双向通道可以隐式转为单向通道单向通道不能转回双向通道编译报错。gopackage main import fmt func main() { ch : make(chan int) // 双向通道 // 双向转单向合法 var writeCh chan- int ch var readCh -chan int ch writeCh - 666 // 只写通道执行发送 -readCh // 只读通道执行接收 // 错误单向无法转回双向 // var ch2 chan int writeCh }实战场景生产者消费者模型单向通道用于函数参数约束规范函数行为代码可读性更高producer 生产者只写通道负责生产数据写入管道consumer 消费者只读通道负责读取管道数据gopackage main import fmt // 生产者只写通道 func producer(out chan- int) { for i : 0; i 10; i { out - i * i } close(out) // 生产完成关闭通道 } // 消费者只读通道 func consumer(in -chan int) { for num : range in { fmt.Println(num , num) } } func main() { ch : make(chan int) go producer(ch) // 开启生产者协程 consumer(ch) // 主线程消费 }八、Channel 核心复习总结Go 并发核心思想通信共享内存channel 是 goroutine 通信载体channel 是引用类型分无缓冲、有缓冲两类无缓冲通道收发必须成对出现天然实现同步有缓冲通道异步存储数据close()关闭通道后不能发送但剩余数据可读取range 简化通道循环读取单向通道约束读写权限常用于生产者消费者模型阻塞逻辑无数据读阻塞、缓冲区满写阻塞。

相关新闻

教育邮箱验证机制解析:从AI服务访问到合规替代方案

教育邮箱验证机制解析:从AI服务访问到合规替代方案

1. 先搞清楚“教育邮箱”到底能做什么,以及为什么有人需要它 如果你在找“最好申请的美国教育邮箱”,大概率不是为了收发邮件,而是冲着它背后的“学生身份”去的。这个身份能解锁一些对普通用户限制或收费的服务,比如某些AI模型的…

2026/7/23 9:26:47 阅读更多 →
三方向映射技术详解:解决UV拉伸,实现高质量纹理投影

三方向映射技术详解:解决UV拉伸,实现高质量纹理投影

1. 项目概述:三方向映射到底是什么,以及为什么你需要它在三维图形渲染里,纹理映射是个基础得不能再基础的操作。我们通常把一张二维的图片“贴”到三维模型表面,这个过程就叫UV映射。但这里有个经典难题:当模型表面在某…

2026/7/24 3:43:49 阅读更多 →
为什么92%的AI分析项目在第3周失败?——资深架构师首曝内部启动检查清单,限时公开

为什么92%的AI分析项目在第3周失败?——资深架构师首曝内部启动检查清单,限时公开

更多请点击: https://codechina.net 第一章:AI数据分析的本质与失败真相 AI数据分析并非自动化的“黑箱魔法”,而是数据、算法、领域知识与工程实践四者深度耦合的系统性工程。其本质是将不确定性问题结构化为可建模、可观测、可迭代的闭环反…

2026/7/24 7:30:50 阅读更多 →

最新新闻

Agentic AI与动态提示工程的自我学习革命

Agentic AI与动态提示工程的自我学习革命

1. 项目概述:Agentic AI提示工程的自我学习革命 最近在AI领域掀起了一股"Agentic AI"的热潮,这种具备自主性和目标导向能力的新型AI系统正在彻底改变我们与大型语言模型(LLM)的交互方式。作为一名长期深耕提示工程领域的实践者,我发…

2026/7/24 8:49:53 阅读更多 →
Substance Painter与Unity材质同步:PBR渲染环境对齐实战指南

Substance Painter与Unity材质同步:PBR渲染环境对齐实战指南

1. 项目概述:为什么材质效果同步是3D美术的“最后一公里”? 如果你是一名3D美术师或者技术美术,一定经历过这种抓狂时刻:在Substance Painter里精心雕琢的材质,金属质感锐利、皮革纹理细腻、布料褶皱自然,一…

2026/7/24 8:49:53 阅读更多 →
专科生论文写作:AI工具选型与实战指南

专科生论文写作:AI工具选型与实战指南

1. 论文写作痛点与AI工具的崛起作为一名经历过专科论文写作的过来人,我深知专科生在学术写作中面临的独特挑战。与本科生相比,专科教育更侧重职业技能培养,导致很多同学在学术规范、文献检索和论文结构方面存在明显短板。记得我第一次写课程论…

2026/7/24 8:49:53 阅读更多 →
基于DWVD与深度学习的轴承故障智能诊断方法

基于DWVD与深度学习的轴承故障智能诊断方法

1. 项目背景与核心价值 轴承故障诊断一直是工业设备健康管理的关键环节。传统方法往往依赖专家经验或简单信号处理技术,难以应对复杂工况下的微弱故障特征提取。这个名为DVMBiLAT的混合诊断网络,通过融合时频分析技术与深度学习模型,实现了从…

2026/7/24 8:49:53 阅读更多 →
CEEMDAN-LSTM组合模型在金融时序预测中的实践与优化

CEEMDAN-LSTM组合模型在金融时序预测中的实践与优化

1. 项目背景与核心价值CEEMDAN(完全自适应噪声集合经验模态分解)是时间序列分析领域的重要工具,特别适合处理非平稳、非线性信号。我在金融时间序列预测项目中,系统测试了5种基于CEEMDAN的组合模型,相比传统方法预测精…

2026/7/24 8:49:53 阅读更多 →
ppt模板_0194_黑艺术派

ppt模板_0194_黑艺术派

PPT模板分享

2026/7/24 8:48:53 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻