• 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中)。

第三,释放锁