diff --git a/eBook/14.2.md b/eBook/14.2.md index 29e9b0f..0f8c481 100644 --- a/eBook/14.2.md +++ b/eBook/14.2.md @@ -53,7 +53,7 @@ if <- ch != 1000{ } ``` -操作符 <- 也被用来发送和接收,Go 尽管不必要,为了可读性,通道的命名通常以 `ch` 开头或者包含 `chan`。通道的发送和接收操作都是自动的:它们通常一气呵成。下面的示例展示了通信操作。 +同一个操作符 `<-` 既用于**发送**也用于**接收**,但Go会根据操作对象弄明白该干什么 。虽非强制要求,但为了可读性通道的命名通常以 `ch` 开头或者包含 `chan`。通道的发送和接收都是原子操作:它们总是互不干扰的完成的。下面的示例展示了通信操作符的使用。 示例 14.2-[goroutine2.go](examples/chapter_14/goroutine2.go) @@ -509,7 +509,7 @@ func (c *container) Iter () <- chan item { for x := range container.Iter() { ... } ``` -可以运行在自己的协程中,所以上边的迭代用到了一个通道和两个协程(可能运行在两个线程上)。就有了一个特殊的生产者-消费者模式。如果程序在协程给通道写完值之前结束,协程不会被回收;设计如此。这种行为看起来是错误的,但是通道是一种线程安全的通信。在这种情况下,协程尝试写入一个通道,而这个通道永远不会被读取,这可能是个 bug 而并非期望它被静默的回收。 +其运行在自己启动的协程中,所以上边的迭代用到了一个通道和两个协程(可能运行在不同的线程上)。 这样我们就有了一个典型的生产者-消费者模式。如果程序在协程给通道写完值之前结束,则这个协程不会被垃圾回收;这是设计使然。这种看起来并不符合预期的行为正是由通道这种线程安全的通信方式所导致的。如此一来,一个协程为了写入一个永远无人读取的通道而被挂起就成了一个bug,而并非你预想中的那样被悄悄回收掉(garbage-collected)了。 习惯用法:生产者消费者模式