您的位置:首页 > 汽车 > 新车 > 东莞企业为什么网站建设_网页设计范文_云优化seo_seo上海培训

东莞企业为什么网站建设_网页设计范文_云优化seo_seo上海培训

2025/2/27 7:19:12 来源:https://blog.csdn.net/weixin_51380508/article/details/145706647  浏览:    关键词:东莞企业为什么网站建设_网页设计范文_云优化seo_seo上海培训
东莞企业为什么网站建设_网页设计范文_云优化seo_seo上海培训

底层数据实现

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所特有的结构,用来存储缓存数据。是个循环链表
  • sendxrecvx用于记录buf这个循环链表中的发送或者接收的index
  • recvqsendq分别是接收(<-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关闭成功关闭成功关闭成功

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com