当前位置: 首页 > news >正文

golang channel底层实现?

底层数据实现

type hchan struct {
    qcount   uint           // 当前队列中的元素数量
    dataqsiz uint           // 环形队列的大小
    buf      unsafe.Pointer // 指向环形队列的指针
    elemsize uint16         // 元素大小
    closed   uint32         // channel 是否关闭
    elemtype *_type         // 元素类型
    sendx    uint           // 发送索引
    recvx    uint           // 接收索引
    recvq    waitq          // 接收等待队列
    sendq    waitq          // 发送等待队列
    lock     mutex          // 互斥锁
}

  • buf是有缓冲的channel所特有的结构,用来存储缓存数据。是个循环链表
  • sendxrecvx用于记录buf这个循环链表中的发送或者接收的index
  • recvqsendq分别是接收(<-channel)或者发送(channel <- xxx)的goroutine抽象出来的结构体(sudog)的队列。是个双向链表
  •   lock 互斥锁在进行获取或者接收时都会进行加锁操作

channel的使用

创建channel实际上就是在内存中实例化了一个hchan的结构体,并返回一个ch指针

当channel缓存满了,或者没有缓存的时候,我们继续send(ch <- xxx)或者recv(<- ch)会阻塞当前goroutine

nil channel有值 channel没值 channel满 channel
<- ch (发送数据)阻塞发送成功发送成功阻塞
ch <- (接收数据)阻塞接收成功阻塞接收成功
close(ch) 关闭channelpanic关闭成功关闭成功关闭成功

相关文章:

  • hot100——11,42
  • python爬虫系列课程3:解决爬虫过程中遇到的编码问题
  • Windows逆向工程入门之调用约定
  • Python logging 库全面指南
  • Skibidus and Fanum Tax (easy version)----Skibidus 和 Fanum 税(简易版)
  • 第四届图像、信号处理与模式识别国际学术会议(ISPP 2025)
  • 利用acme.sh 申请 Google 免费证书
  • 人车检测与计数系统(python+课程设计报告+源代码+数据集)
  • LeetCode 98.验证二叉搜索树
  • vscode远程报错:Remote host key has changed,...
  • 软件安全测试技术系列|跨站脚本攻击(Cross Sites Script)类漏洞攻击方式与防御措施
  • Opencv项目实战:26 信用卡号码识别与类型判定
  • 自动化办公|通过xlwings进行excel格式设置
  • 防火墙综合实验
  • ✨1.HTML、CSS 和 JavaScript 是什么?
  • 深度学习笔记——LSTM
  • 自动化测试框架搭建-单次接口执行-三部曲
  • 深入理解 fnmatch 函数的实现
  • 04 redis数据类型
  • 《DeepSeek赋能工业互联网:解锁数据深度分析新姿势》
  • 印度最新发声:对所有敌对行动均予以反击和回应,不会升级冲突
  • 国家主席习近平会见斯洛伐克总理菲佐
  • 101条关于减重的知识,其中一定有你不知道的
  • 中华人民共和国和俄罗斯联邦关于进一步加强合作维护国际法权威的联合声明
  • 上海如何为街镇营商环境赋能?送政策、配资源、解难题、强活力
  • 谢晖不再担任中超长春亚泰队主教练:战绩不佳主动请辞