channel 的数据结构
GitHub地址:
github.com/golang/go/b…
- qcount:代表chan中已经接收但还没被取走的元素的个数,内建函数len可以返回这个字段的值。
- dataqsiz:队列大小,chan使用一个循环队列来存放元素,循环队列很适合生产者-消费者的场景
- buf:存放元素的循环队列的buffer
- elemtype和elemsize:chan中元素的类型和size
- sendx:处理发送数据的指针在buf中的位置,一旦接收新的数据,指针就会加上elemsize,移向下一个位置,
- recvx:处理接收请求时的指针在 buf 中的位置。一旦取出数据,此指针会移动到下一个位置。
- recvq:chan 是多生产者多消费者的模式,如果消费者因为没有数据可读而被阻塞了,就会被加入到 recvq 队列中。
- sendq:如果生产者因为 buf 满了而阻塞,会被加入到 sendq 队列中。