大纲
- 是什么,结构体定义
- 给chan送数据
- 从chan读数据
是什么?
1 本质是一个环形数组 源码中定义为hchan 主要属性有- 数组长度
- 数据数量
- 环形数组
- 环形数组的头尾索引
- 等待读chan的go链表
- 等待写chan的go链表
给chan送数据
就是外部goroutine向chan发送数据,- 如果chan关闭了就panic
- 如果有go正在等待从chan读数据,就直接把数据给它,就不经过环形数组了,然后return
- 如果不是,再看如果环形数组中还有空位,就写入环形数组,移动头尾指针,数据数量计数+1,然后return
- 如果还不是,就把当前业务的go存入等待队列,然后阻塞,就暂定在这里,如果有外部go读数据了就唤醒阻塞,业务go继续执行
从chan接收数据
就是外部goroutine从chan接收数据- 如果chan已经关闭了,就直接返回
- 如果有go正在等待向chan写数据,那么就直接等待go的数据给这个go,然后return。不经过环形数组
- 如果环形数组有数据,就从环形数组取出数据,移动指针,然后return
- 如果都没有,就阻塞,就暂定,就等待外部go写入数据、写了再唤醒,再继续执行