2 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個贊
您正在將n 個值寫入通道(從 0 到n-1),但試圖從通道中讀取n+1 個值(從 0 到n)。如果沒有明確關(guān)閉通道,main
函數(shù)將永遠(yuǎn)等待最后一個值。
究竟是什么導(dǎo)致了死鎖?
之后?迭代,運(yùn)行的夠程fibonacci
功能將退出。在這個 goroutine 退出后,你程序中唯一剩下的 goroutine 就是main
goroutine,這個 goroutine 正在等待一些數(shù)據(jù)被寫入c
通道——并且因?yàn)闆]有其他 goroutine 可能會向這個通道寫入數(shù)據(jù),它會永遠(yuǎn)等待。這正是錯誤消息試圖告訴您的內(nèi)容:“所有 goroutines(“all”只是“一個”,這里)都睡著了”。
函數(shù)中的_, ok := <- c
調(diào)用main
只會在c
通道關(guān)閉后立即停止阻塞(因?yàn)閺耐ǖ雷x取是阻塞的,這需要從另一個 goroutine 中完成)。當(dāng)通道關(guān)閉時(shí),該main
函數(shù)將從通道中讀取剩余數(shù)據(jù)(當(dāng)它是緩沖通道時(shí))

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個贊
主循環(huán)中的循環(huán)期望在通道中進(jìn)行 n 次通信,但在 func fibonacci 中僅產(chǎn)生 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
}
應(yīng)該工作 http://play.golang.org/p/zdRuy14f9x
- 2 回答
- 0 關(guān)注
- 143 瀏覽
添加回答
舉報(bào)