一、golang源码中对chan的结构定义
type hchan struct {
qcount uint // total data in the queue 当前队列中的元素数量
dataqsiz uint // size of the circular queue 队列可以容纳的元素数量,无缓冲区则是0
buf unsafe.Pointer // points to an array of dataqsiz elements 队列的缓冲区指针, 指向一个环形数组
elemsize uint16 元素的大小
closed uint32 是否已关闭
elemtype *_type // element type 元素的类型, 判断是否调用写屏障时使用
sendx uint // send index 发送元素的序号
recvx uint // receive index。 接受元素的序号
recvq waitq // list of recv waiters 当前等待从 channel 接收数据的 G 的链表
sendq waitq // list of send waiters 当前等待发送数据到 channel 的 G 的链表
lock mutex 操作 channel 时使用的线程锁
}
源码中针对c <- x 执行调用的是chansend方法,chansend方法中我们只需要关注对接受者唤醒的这一句:
if sg := c.recvq.dequeue(); sg != nil {
// Found a waiting receiver. We pass the v