当前位置: 首页 > 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关闭成功关闭成功关闭成功

http://www.dtcms.com/a/24285.html

相关文章:

  • 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赋能工业互联网:解锁数据深度分析新姿势》
  • python常用库整理
  • 【实用技巧】云服务器+FRP搭建自己的远程控制向日葵
  • 最简单的难题——游戏英雄升级潜力评估
  • Flutter 跳转后不允许返回
  • 习题系列——数值分析与数值计算
  • el-table树状表格,默认展开第一个节点的每一层
  • 基因研究的“北极盲区”
  • 浏览器开发者工具(F12)查看请求的响应体内容显示”无法加载响应数据: No resource with given identifier found“
  • Linux网络 | 多路转接Reactor
  • HTB—OnlyHacks