go channel源码
大纲
-
是什么,结构体定义
-
给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写入数据、写了再唤醒,再继续执行