go channel源码

大纲

  1. 是什么,结构体定义
  2. 给chan送数据
  3. 从chan读数据

 


是什么?

1
本质是一个环形数组
源码中定义为hchan
主要属性有
  1. 数组长度
  2. 数据数量
  3. 环形数组
  4. 环形数组的头尾索引
  5. 等待读chan的go链表
  6. 等待写chan的go链表
 

给chan送数据

就是外部goroutine向chan发送数据,
  1. 如果chan关闭了就panic
  2. 如果有go正在等待从chan读数据,就直接把数据给它,就不经过环形数组了,然后return
  3. 如果不是,再看如果环形数组中还有空位,就写入环形数组,移动头尾指针,数据数量计数+1,然后return
  4. 如果还不是,就把当前业务的go存入等待队列,然后阻塞,就暂定在这里,如果有外部go读数据了就唤醒阻塞,业务go继续执行
 

从chan接收数据

就是外部goroutine从chan接收数据
 
  1. 如果chan已经关闭了,就直接返回
  2. 如果有go正在等待向chan写数据,那么就直接等待go的数据给这个go,然后return。不经过环形数组
  3. 如果环形数组有数据,就从环形数组取出数据,移动指针,然后return
  4. 如果都没有,就阻塞,就暂定,就等待外部go写入数据、写了再唤醒,再继续执行
posted @ 2022-12-26 17:17  董客园  阅读(18)  评论(0编辑  收藏  举报