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 關注
- 154 瀏覽
添加回答
舉報