1、channel数据结构
1.1 结构定义
//src/runtime/chan.go type hchan struct { qcount uint //缓冲区队列中元素总数 dataqsiz uint //缓冲区队列大小 buf unsafe.Pointer //缓冲区队列,用于存放元素,该缓冲区模拟环形结构 elemsize uint16 //元素大小 closed uint32 //channel是否关闭,关闭设为1 elemtype *_type //元素类型 sendx uint //发送索引,下一个待放入元素的索引 recvx uint //接收索引,下一个待接收元素的索引 recvq waitq //接收等待G队列 sendq waitq //发送等待G队列 lock mutex //channel操作过程中需加锁 }
1.2 结构图
- elem:缓冲区存储的元素。
- sudog:因接收或发送数据阻塞的G结构,条件满足时用于唤醒G运行。
2、channel操作
2.1 创建channel
创建channel函数为src/runtime/chan.go中makechan,该函数执行流程如下:
2.2 发送数据
发送数据函数为src/runtime/chan.go中chansend,该函数执行流程如下:
2.3 接收数据
接收数据函数为src/runtime/chan.go中chanrecv,该函数执行流程如下:
2.4 关闭channel
关闭channel函数为src/runtime/chan.go中closechan,该函数执行流程如下:
3、示例
测试用例代码如下:
//main.go package main func main() { ch := make(chan int) ch <- 123 <- ch close(ch) }
编译后生成的二进制解析为:
文章评论