RainbowMango / GoExpertProgramming

《Go专家编程》Go语言快速入门,轻松进阶!
1.86k stars 306 forks source link

[勘误]反馈一个第5章第3节的context描述错误 #90

Closed povsister closed 3 years ago

povsister commented 3 years ago

问题描述 在介绍context的时候,对于 context.Done() 是这样描述的

当context关闭后,Done()返回一个被关闭的管道,关闭的管道仍然是可读的,据此goroutine可以收到关闭请求,当context还未关闭时,Done()返回nil

显然最后一句是不妥的,Done只可能会返回nil,参考下面原文。

如何找到这个错误

您认为应该如何?

Done may return nil if this context can never be canceled.

原文

// Done returns a channel that's closed when work done on behalf of this
// context should be canceled. Done may return nil if this context can
// never be canceled. Successive calls to Done return the same value.
// The close of the Done channel may happen asynchronously,
// after the cancel function returns.

建议的修改

无论context取消与否,context.Done() 总会返回同一个只读的管道,
这个管道会在context被取消时关闭。区别在于,context取消后,返回的管道是已经关闭的。
需要注意的是:如果当前context不支持取消,Done()可能会返回nil。例如, context.Backgroud()。
对于一个 nil chan,select语句会直接忽略这个分支,但如果对 nil chan 直接进行读写则会导致当前goroutine永远阻塞。

图片 如果有可能,尽量提供图片。

其他补充信息

很早之前发现了这么一本开源书籍,觉得很棒加了收藏夹,最近在造轮子的时候又想参考一些内容,结果点开404才愕然发现出了书。 白嫖失败所以第二天就在京东下单买了😂 个人觉得内存管理和GC部分是对我帮助最大的一块,尤其是堆内存分配机制这块,讲的很棒。 最近刚刚读过 The Journey of Go's Garbage Collector,对GC Pacer这块还不是很理解具体细节,不知道作者是否有兴趣讲解一二。

另外感觉本书可以增补的一些部分,struct padding(memory alignment/wasted byte),memory model(happens before),atomic都是很有意思的内容。前者对于了解struct内存布局,reflect offset等hack操作都很有帮助,后者可以加深对于同步机制的理解,或是帮助使用一些基于指令级别的“无锁”操作。

RainbowMango commented 3 years ago

抱歉拖这么久才回复你,是的这段描述是不妥。

RainbowMango commented 3 years ago

结合你的建议,拟修改如下:

-该方法返回一个channel,需要在select-case语句中使用,如"case <-context.Done():"。
+该方法返回一个用于探测Context是否取消的channel,当Context取消时会自动将该channel关闭。

-当context关闭后,Done()返回一个被关闭的管道,关闭的管道仍然是可读的,据此goroutine可以收到关闭请求;
-当context还未关闭时,Done()返回nil。
+需要注意的是,对于不支持取消的Context,该方法可能会返回nil。例如, context.Backgroud()。

Any comments?

RainbowMango commented 3 years ago

另外,我始终觉得Go语言只是个工具,对语言深层次的设计原理,我觉得只适用于少数发烧友。暂时没计划再深入研究。

povsister commented 3 years ago

Any comments?

没什么问题,感觉更精炼了些。

povsister commented 3 years ago

另外,我始终觉得Go语言只是个工具,对语言深层次的设计原理,我觉得只适用于少数发烧友。暂时没计划再深入研究。

可能因为个人习惯的缘故,使用工具之前更喜欢理解工具的基本概念和设计原理,工具用起来才能更顺手。 书很棒,对于语言深入理解很有帮助 👍

RainbowMango commented 3 years ago

可能因为个人习惯的缘故,使用工具之前更喜欢理解工具的基本概念和设计原理,工具用起来才能更顺手

的是,了解了设计原理用起来更不容易出错。