通过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菜鸟
学习更多!