chan
类型
三种:仅输入、仅输出、双工
数据结构
环形队列+读写goroutine+锁 = chan
//path:src/runtime/chan.go
type hchan struct {
qcount uint // 当前队列列中剩余元素个数
dataqsiz uint // 环形队列长度,即可以存放的元素个数
buf unsafe.Pointer // 环形队列列指针
elemsize uint16 // 每个元素的⼤⼩
closed uint32 // 标识关闭状态
elemtype *_type // 元素类型
sendx uint // 队列下标,指示元素写⼊入时存放到队列列中的位置 x
recvx uint // 队列下标,指示元素从队列列的该位置读出
recvq waitq // 等待读消息的goroutine队列
sendq waitq // 等待写消息的goroutine队列
lock mutex // 互斥锁,chan不允许并发读写
}
转自:https://studygolang.com/articles/32676?fr=sidebar