通过chan的流程图,流程化的看源码,事半功倍。

步骤:

绿色虚线
runtime/chan.go
makechan(t *chantype, size int) *hchanchansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) boolchanrecv(c *hchan, ep unsafe.Pointer, block bool) (selected, received bool)selectnbsend(c *hchan, elem unsafe.Pointer) (selected bool)selectnbrecv(elem unsafe.Pointer, c *hchan) (selected, received bool)closechan(c *hchan) 

在没有看源码之前,一直没有太关注chan的非阻塞调用怎么实现的;但是一看源码,就会发现它实现的非常巧妙。

bool

对此有一个疑问,什么时候会用到非阻塞的chan调用呢?

我们可以看到,有编译器实现优化:

selectnbsend
selectnbrecv

具体的实现细节就需要自己通过源码来进行细节分析了。

由于高清大图,上传不到,请复制链接查看,或者点击查看原文。

关注订阅号:

GolangNewbie GO菜鸟

学习更多!