2 回答
TA贡献1829条经验 获得超7个赞
您正在将n 个值写入通道(从 0 到n-1),但试图从通道中读取n+1 个值(从 0 到n)。如果没有明确关闭通道,main
函数将永远等待最后一个值。
究竟是什么导致了死锁?
之后ñ迭代,运行的够程fibonacci
功能将退出。在这个 goroutine 退出后,你程序中唯一剩下的 goroutine 就是main
goroutine,这个 goroutine 正在等待一些数据被写入c
通道——并且因为没有其他 goroutine 可能会向这个通道写入数据,它会永远等待。这正是错误消息试图告诉您的内容:“所有 goroutines(“all”只是“一个”,这里)都睡着了”。
函数中的_, ok := <- c
调用main
只会在c
通道关闭后立即停止阻塞(因为从通道读取是阻塞的,这需要从另一个 goroutine 中完成)。当通道关闭时,该main
函数将从通道中读取剩余数据(当它是缓冲通道时)
TA贡献1852条经验 获得超7个赞
主循环中的循环期望在通道中进行 n 次通信,但在 func fibonacci 中仅产生 n-1
func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ { //here
c <- x
x, y = y, x+y
}
// close(c) // It's commented out on purpose
}
应该工作 http://play.golang.org/p/zdRuy14f9x
- 2 回答
- 0 关注
- 132 浏览
添加回答
举报