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)
}
编译后生成的二进制解析为:






文章评论