1.简介
channel是golang在语言层面提供的goroutine间的通讯方式。
读写特征:
-
给一个 nil channel 发送数据,造成永远阻塞
-
从一个 nil channel 接收数据,造成永远阻塞
-
给一个已经关闭的 channel 发送数据,引起 panic
-
从一个已经关闭的 channel 接收数据,如果缓冲区中为空,则返回一个零值
-
无缓冲的channel是同步的,而有缓冲的channel是非同步的
2.chan数据结构
type hchan struct { qcount uint // 当前队列中剩余元素个数 dataqsiz uint // 环形队列长度,即可以存放的元素个数 buf unsafe.Pointer // 环形队列指针 elemsize uint16 // 每个元素的大小 closed uint32 // 标识关闭状态 elemtype *_type // 元素类型 sendx uint // 队列下标,指示元素写入时存放到队列中的位置 recvx uint // 队列下标,指示元素从队列的该位置读出 recvq waitq // 等待读消息的goroutine队列 sendq waitq // 等待写消息的goroutine队列 lock mutex // 互斥锁,chan不允许并发读写 }