前言
golangphpjavaPythonjscgoC
见真身
结构体
chanmakemake
这, 还是没有函数的具体实现啊. 汇编看一下. 编写以下内容:
执行命令:
虽然汇编咱看不懂, 但是其中有一行还是引起了我的注意.
makeruntime.makechan
hchan
可以看的出来, 管道简单说就是一个队列加一把锁.
发送数据
runtime.chansend1
然后查看真正实现, 函数步骤如下(个人理解, 有一些 test 使用的代码被我删掉了. ):
虽然最终阻塞的地方没看太明白, 不过发送数据的大体流程很清楚:
- 若无需阻塞且不能发送数据, 返回失败
- 若存在接收者, 直接发送数据
- 若存在缓存, 将数据放到缓存中
- 若无需阻塞, 返回失败
- 阻塞等待发送数据
selectnbsend
selectselectnbsendif
接收数据
runtime.chanrecv
channel
上手
channel
定义
发送与接收
channel