Love My Love

gopl.io chapter 9 memo5 study

2020.08.17

“The Go Programming Language” 《Go 语言圣经》 第九章 memo5.go 那道例题,困扰了我很久,我承认我理解能力,对Go的掌握程度都没达到我的预期,简单点说,我没我想的那么聪慧。所以我只好花了快5天时间,去理解这个例题,最后,我终于能把每行代码都解释明白了。我记性不好,所以在这里留个档,方便自己也方便同样学习这一例题的人们。如果有错误的地方,我理解有误的地方,欢迎指出。

为了能理解 memo5.go ,我特意画了一张图,我再次感受到了那条我听过但忘记谁说过的一个什么劳什子定理:“当你能够把问题画下来的时候,你已经解决了一半的问题。”

这里是图(回头放)
这是图的源文件(进去再下载):https://github.com/wedojava/gopl_study/blob/master/ch9/memo5/analysis.xlsx
这是源码位置:

Ok,下面开始正题,我的理解是这样的:

  • 整个程序的通信是由 channel 来承担,传递数据的最终形态就是 value+err ,就是 result struct。
  • Memo struct 里就一个 uncached channel ,用来放请求 request , Entry 里 res 用来放查询结果,ready 是为了方便 call 和 deliver 通信而存在的 channel 。
  • 左边是需求方,甲方(Memo struct),右边是乙方(Entry struct),甲方要数据,乙方提供数据,所以就有了:
    1. 甲方通过自己的 channel 提出了 request ,
    2. 乙方查看 request 里的 key 有没有对应的 cache,有就 deliver ,没有就 call 。
    3. call 完了后给 deliver 一个信号,deliver 就把新 call 出来的内容放到 response channel 里去。
    4. 最终的结果是:乙方 e 把结果打包为 result, 塞到response channel 里。
    5. 而甲方一直在 response 边等着呢,一旦 e 把东西放进去, response 立即会收到result,一轮甲乙双方的交互结束。

TO BE CONTINUE …

EOF

发表评论