channel 如何实现

147 阅读1分钟

channel 的数据结构

图片.png 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 队列中。