golangchannel底层实现?
- 游戏开发
- 2025-09-02 01:39:02

底层数据实现
type hchan struct { qcount uint // 当前队列中的元素数量 dataqsiz uint // 环形队列的大小 buf unsafe.Pointer // 指向环形队列的指针 elemsize uint16 // 元素大小 closed uint32 // channel 是否关闭 elemtype *_type // 元素类型 sendx uint // 发送索引 recvx uint // 接收索引 recvq waitq // 接收等待队列 sendq waitq // 发送等待队列 lock mutex // 互斥锁 }
buf是有缓冲的channel所特有的结构,用来存储缓存数据。是个循环链表sendx和recvx用于记录buf这个循环链表中的发送或者接收的indexrecvq和sendq分别是接收(<-channel)或者发送(channel <- xxx)的goroutine抽象出来的结构体(sudog)的队列。是个双向链表 lock 互斥锁在进行获取或者接收时都会进行加锁操作 channel的使用创建channel实际上就是在内存中实例化了一个hchan的结构体,并返回一个ch指针
当channel缓存满了,或者没有缓存的时候,我们继续send(ch <- xxx)或者recv(<- ch)会阻塞当前goroutine
nil channel有值 channel没值 channel满 channel<- ch (发送数据)阻塞发送成功发送成功阻塞ch <- (接收数据)阻塞接收成功阻塞接收成功close(ch) 关闭channelpanic关闭成功关闭成功关闭成功golangchannel底层实现?由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“golangchannel底层实现?”
上一篇
java方法引用