- buf:循环(环形)链表,保存数据
- sendx:保存下一个数据保存的位置
- recvx:保存下一个获取数据的位置
- lock:互斥锁,当使用send (ch <- xx)或者recv ( <-ch)的时候,首先要锁住hchan这个结构体。以此保证FIFO。
- recvq 和 sendq 分别是接收(<-channel)或者发送(channel <- xxx)的goroutine抽象出来的结构体(sudog)的队列,是个双向链表。
创建channel实际上就是在内存中实例化了一个hchan的结构体,并返回一个ch指针,我们使用过程中channel在函数之间的传递都是用的这个指针,这就是为什么函数传递中无需使用channel的指针,而直接用channel就行了,因为channel本身就是一个指针。
每一步的操作的细节可以细化为:
第一,加锁
第二,把数据从goroutine中copy到“队列”中(或者从队列中copy到goroutine中)。
第三,释放锁