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/10/11 11:23:52 阅读更多 →
三方向映射技术详解:解决UV拉伸,实现高质量纹理投影

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

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

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

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

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

2026/10/9 14:25:38 阅读更多 →

最新新闻

对话式地图助手落地实践:语言模型到地图动作的适配层设计

对话式地图助手落地实践:语言模型到地图动作的适配层设计

从聊天机器人一脚踩进地图场景的那段时间,我被一个问题折磨了很久:语言模型再能聊,跟地图引擎之间始终隔着一道墙。用户在对话框里说"帮我找滨河公园附近评分高的粤菜馆,然后规划一条地铁过去的路线",前端却…

2026/10/14 10:09:42 阅读更多 →
Agent-Skills架构实战:如何设计可复用、可组合的智能体技能模块

Agent-Skills架构实战:如何设计可复用、可组合的智能体技能模块

1. 从“agent-skills”这个标题说起:它到底在解决什么问题 第一次看到“agent-skills”这个标题,我脑子里蹦出来的不是某个具体框架,而是一类很实际的需求: 怎么让一个智能体(agent)真正具备可复用、可组合…

2026/10/14 10:09:42 阅读更多 →
SwiftUI 与 Agent 结合:声明式 UI 驱动智能体技能开发实战

SwiftUI 与 Agent 结合:声明式 UI 驱动智能体技能开发实战

1. 这个标题到底在说什么第一次看到 "SwiftUI-Agent-Skill" 这个组合词,我脑子里蹦出来的第一反应是:这大概率不是一个单纯的 UI 框架教程,也不是一个纯粹的 AI Agent 科普,而是把这两条线拧在一起的东西。拆开看就很清…

2026/10/14 10:09:42 阅读更多 →
虚拟试穿技术原理与电商AI应用边界解析

虚拟试穿技术原理与电商AI应用边界解析

我无法按照该标题生成符合要求的博文内容,原因如下:标题“ChatGPT 全球上线虚拟试穿与商品收藏功能”存在事实性错误:ChatGPT 是由 OpenAI 开发的语言模型,不具备、也从未发布过“虚拟试穿”或“商品收藏”等电商类功能。该描述混…

2026/10/14 10:09:42 阅读更多 →
知识工作插件化:从采集到输出,打造个人半自动工作流

知识工作插件化:从采集到输出,打造个人半自动工作流

如果你和我一样,每天有一半时间泡在文档、网页、笔记和聊天记录里,那你大概也遇到过这种状态:明明收集了一堆资料,真到要写东西的时候,却感觉脑子里什么都没留下。这就是我搭 knowledge-work-plugins 这套插件集的初衷…

2026/10/14 10:09:42 阅读更多 →
Node.js+Vue全栈开发出租车智能调度系统实践

Node.js+Vue全栈开发出租车智能调度系统实践

1. 项目背景与核心需求出租车业务管理系统是传统运输行业数字化转型的典型场景。随着网约车平台的兴起,传统出租车公司面临着运营效率低下、调度方式落后、数据统计困难等痛点。这个基于Node.jsVue的全栈项目,正是为了解决以下核心问题:实时调…

2026/10/14 10:08:38 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →