【发布时间】:2019-05-10 06:35:07
【问题描述】:
以下代码:
package main
import (
"fmt"
"strings"
)
var data = []string{
"The yellow fish swims slowly in the water",
"The brown dog barks loudly after a drink ...",
"The dark bird bird of prey lands on a small ...",
}
func main() {
histogram := make(map[string]int)
words := make(chan string)
for _, line := range data {
go func(l string) {
for _, w := range strings.Split(line, " ") {
words <- w
}
}(line)
}
defer close(words)
for w := range words {
histogram[w]++
}
fmt.Println(histogram)
}
以死锁结束:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
/tmp/sandbox780076580/main.go:28 +0x1e0
我的理解是频道词会阻塞作者和读者以达到一些同步。我正在尝试为所有 goroutines(编写器)和 main 中的单个读取器(使用“range”命令)使用单个通道。
我也尝试过缓冲通道 - 类似的失败。
我很难理解为什么这不起作用。有什么理解技巧吗?
谢谢。
【问题讨论】:
-
延迟调用在周围函数退出时执行。当通道关闭时,通道上的范围循环退出。由于您试图在 main 的退出处关闭通道,因此通道上的范围循环永远不会退出,因此 main 也不会退出。 X 正在等待 Y 发生,而 Y 正在等待 X 发生。