channel原来就是个环形队列

golang有一个很重要的特性就是channel,经常配合goroutine一起使用。

当然,其中也涉及到有缓冲和无缓冲的情况,为什么会造成这种情况,我们会在下面解释。

channel的数据结构不太复杂,就是一个环形队列,里面保存了长度qcount,容量dataqsiz,数据buf,以及前后索引sendx,recvx。

closed用来标识channel的状态,0表示未关闭,非0表示已关闭,如果关闭,那么就不能发送数据。

在内部有两个make函数,一个是makechan64,一个是makechan,其实makechan64本质上还是调用的makechan。

初始化的时候可以传入长度size,然后根据你初始化数据的类型大小elem.size计算是否有可用空间。

此时,将结构体剩余字段赋值。

就是ch