前言

golangphpjavaPythonjscgoC

见真身

结构体

chanmakemake

这, 还是没有函数的具体实现啊. 汇编看一下. 编写以下内容:

执行命令:

虽然汇编咱看不懂, 但是其中有一行还是引起了我的注意.

makeruntime.makechan

hchan

可以看的出来, 管道简单说就是一个队列加一把锁.

发送数据

runtime.chansend1

然后查看真正实现, 函数步骤如下(个人理解, 有一些 test 使用的代码被我删掉了. ):

虽然最终阻塞的地方没看太明白, 不过发送数据的大体流程很清楚:

  • 若无需阻塞且不能发送数据, 返回失败
  • 若存在接收者, 直接发送数据
  • 若存在缓存, 将数据放到缓存中
  • 若无需阻塞, 返回失败
  • 阻塞等待发送数据
selectnbsend
selectselectnbsendif

接收数据

runtime.chanrecv
channel

上手

channel

定义

发送与接收

channel
您可能感兴趣的文章: