From 87f4e0ab78588e8ecd4e4762d6e1aa8d4be2d686 Mon Sep 17 00:00:00 2001 From: Hugh Date: Mon, 18 Apr 2022 19:04:07 +0800 Subject: [PATCH] =?UTF-8?q?=E7=97=85=E5=8F=A5=E4=BF=AE=E6=94=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update - ch7-04 增加一个语义分隔的句号 - ch8-04-1 两个连续的“唤醒” 疑为错误 故删除 --- ch7/ch7-04.md | 2 +- ch8/ch8-04-1.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ch7/ch7-04.md b/ch7/ch7-04.md index 2cd6fe3..42f35f8 100644 --- a/ch7/ch7-04.md +++ b/ch7/ch7-04.md @@ -72,7 +72,7 @@ func (f *celsiusFlag) Set(s string) error { } ``` -调用fmt.Sscanf函数从输入s中解析一个浮点数(value)和一个字符串(unit)。虽然通常必须检查Sscanf的错误返回,但是在这个例子中我们不需要因为如果有错误发生,就没有switch case会匹配到。 +调用fmt.Sscanf函数从输入s中解析一个浮点数(value)和一个字符串(unit)。虽然通常必须检查Sscanf的错误返回,但是在这个例子中我们不需要。因为如果有错误发生,就没有switch case会匹配到。 下面的CelsiusFlag函数将所有逻辑都封装在一起。它返回一个内嵌在celsiusFlag变量f中的Celsius指针给调用者。Celsius字段是一个会通过Set方法在标记处理的过程中更新的变量。调用Var方法将标记加入应用的命令行标记集合中,有异常复杂命令行接口的全局变量flag.CommandLine.Programs可能有几个这个类型的变量。调用Var方法将一个`*celsiusFlag`参数赋值给一个flag.Value参数,导致编译器去检查`*celsiusFlag`是否有必须的方法。 diff --git a/ch8/ch8-04-1.md b/ch8/ch8-04-1.md index a0eb71a..d0e6208 100644 --- a/ch8/ch8-04-1.md +++ b/ch8/ch8-04-1.md @@ -2,7 +2,7 @@ 一个基于无缓存Channels的发送操作将导致发送者goroutine阻塞,直到另一个goroutine在相同的Channels上执行接收操作,当发送的值通过Channels成功传输之后,两个goroutine可以继续执行后面的语句。反之,如果接收操作先发生,那么接收者goroutine也将阻塞,直到有另一个goroutine在相同的Channels上执行发送操作。 -基于无缓存Channels的发送和接收操作将导致两个goroutine做一次同步操作。因为这个原因,无缓存Channels有时候也被称为同步Channels。当通过一个无缓存Channels发送数据时,接收者收到数据发生在再次唤醒唤醒发送者goroutine之前(译注:*happens before*,这是Go语言并发内存模型的一个关键术语!)。 +基于无缓存Channels的发送和接收操作将导致两个goroutine做一次同步操作。因为这个原因,无缓存Channels有时候也被称为同步Channels。当通过一个无缓存Channels发送数据时,接收者收到数据发生在再次唤醒发送者goroutine之前(译注:*happens before*,这是Go语言并发内存模型的一个关键术语!)。 在讨论并发编程时,当我们说x事件在y事件之前发生(*happens before*),我们并不是说x事件在时间上比y时间更早;我们要表达的意思是要保证在此之前的事件都已经完成了,例如在此之前的更新某些变量的操作已经完成,你可以放心依赖这些已完成的事件了。