废话不多说,直奔主题。
channel的整体结构图

简单说明:
buf
是有缓冲的channel所特有的结构,用来存储缓存数据。是个循环链表
sendx
和recvx
用于记录buf
这个循环链表中的发送或者接收的index
lock
是个互斥锁。
recvq
和sendq
分别是接收(<-channel)或者发送(channel <- xxx)的goroutine抽象出来的结构体(sudog)的队列。是个双向链表
源码位于/runtime/chan.go
中(目前版本:1.11)。结构体为hchan
。
type hchan struct {
qcount