GO 语言中 chan 的理解 [复制链接]
发表于 2023-7-3 20:30:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
GO 语言中 chan 的理解

chan 的底层实现是怎么样的?

chan 是 Go 语言中的一个关键字,用于实现并发通信。chan 可以用于在不同的 goroutine 之间传递数据,实现数据的同步和异步传输。
在底层实现上,chan 是通过一个结构体来表示的,这个结构体包含了一个指向数据的指针和两个指向信道的指针。其中,一个指针用于发送数据,另一个指针用于接收数据。
下面是 chan 的底层实现代码
  1. type hchan struct {
  2.     qcount   uint           // 当前队列中的元素数量
  3.     dataqsiz uint           // 队列的容量
  4.     buf      unsafe.Pointer // 指向队列的指针
  5.     elemsize uint16         // 元素的大小
  6.     closed   uint32         // 是否关闭
  7.     elemtype *_type         // 元素的类型
  8.     sendx    uint           // 发送的位置
  9.     recvx    uint           // 接收的位置
  10.     recvq    waitq          // 接收等待队列
  11.     sendq    waitq          // 发送等待队列
  12.     lock     mutex          // 锁
  13. }
复制代码
chan 的发送和接收操作的底现

当我们向 chan 发送数据时,会先检查 chan 是否已经关闭。如果 chan 已经关闭,那么发送操作会直接返回一个 panic。否则,会将数据复制到队列中,并更新发送位置。
下面是 chan 发送操作的底层实现代码
[code]func chansend(c *hchan, ep unsafe.Pointer, block bool) bool {    // 检查 chan 是否已经关闭    if c.closed != 0 {        panic("send on closed channel")    }    // 计算发送位置    i := c.sendx    // 计算队列中的元素数量    if c.qcount 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表