一只羊羊
go-数据结构-chan
原创
关注作者
腾讯云
开发者社区
文档
建议反馈
控制台
登录/注册
首页
学习
活动
专区
圈层
工具
MCP广场
文章/答案/技术大牛
搜索
搜索
关闭
发布
首页
学习
活动
专区
圈层
工具
MCP广场
返回腾讯云官网
一只羊羊
首页
学习
活动
专区
圈层
工具
MCP广场
返回腾讯云官网
社区首页
>
专栏
>
go-数据结构-chan
go-数据结构-chan
原创
一只羊羊
关注
发布于 2025-03-25 11:23:25
发布于 2025-03-25 11:23:25
72
0
举报
chan的结构
qcount记录队列中的原始数量
buf 环形队列,用来储存channel中的数据
closed 标识chanel是否被关闭
sendx 指向环节队列写入下标,表示可以写入数据的位置
recvx 指向环形队列读取下标,表示可以读取数据的位置
recvq 用来存储等待读取的协程链表(双向链表)
sendq 用来存储等待写入的协程链表(双向链表)
过程 (写和close过程中针对chan为空或者对已关闭的chan做写操作会强制panic)
读过程
若sendq为空,且无缓冲区,则将当前协程加入recvq等待有数据后被唤醒
若sendq为空,且有缓存区且有数据,则直接从buf中读取
若sendq不为空,且无缓冲区,则取sendq队列头的协程SG数据放入读协程RG中,SG被唤醒后返回
若sendq不为空,且有缓冲区,则取buf的recvx位置的数据,并将sendq头的协程数据放入buf的sendx位置,并移动recvx和sendx位置
写过程
判断closed是否是关闭标识,是则panic
若recvq不为空,则无缓冲,则直接将数据给recvq头协程G,唤醒并返回
若recvq不为空,有缓冲(但无数据),则直接将数据给recvq头协程G,唤醒并返回
若recvq为空,无缓冲,等将写协程G放到sendq中等待被唤醒
若recvq为空,有缓冲,将数据放入缓存区buf,但若buf已满,则放到sendq等待
关闭过程
chan为空,则panic
closed已经是关闭标识,则panic
若sendq中还有协程等待,则panic
chan常见的panic场景
关闭nil chan
关闭已关闭的chan
关闭chan时sendq还存在未处理完的协程
向已关闭的chan写数据
注意:参考书籍地址:
https://docs.kilvn.com/GoExpertProgramming/chapter07/7.1-foreword.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系
cloudcommunity@tencent.com
删除。
go
channel
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系
cloudcommunity@tencent.com
删除。
go
channel
评论
登录
后参与评论
0 条评论
热度
最新
推荐阅读
目录
chan的结构
过程 (写和close过程中针对chan为空或者对已关闭的chan做写操作会强制panic)
读过程
写过程
关闭过程
chan常见的panic场景
注意:参考书籍地址:https://docs.kilvn.com/GoExpertProgramming/chapter07/7.1-foreword.html
领券
问题归档
专栏文章
快讯文章归档
关键词归档
开发者手册归档
开发者手册 Section 归档
0
0
0
推荐