一個關(guān)于select頻道聲明的簡短節(jié)目。package mainimport "fmt"func fibonacci(c, quit chan int) { x, y := 0, 1 for { select { case c <- x: x, y = y, x+y case s := <-quit: fmt.Println("quit =",s) return } }}func main() { c := make(chan int) quit := make(chan int) go func() { for i := 0; i < 10; i++ { fmt.Println(<-c) } quit <- 9 }() fibonacci(c, quit)}上面代碼的結(jié)果:0112358132134quit = 9它工作得很好。但在我改變后(在func fibonacci)case s := <-quit: fmt.Println("quit =",s)到case <-quit: fmt.Println(<-quit)發(fā)生了致命錯誤:0112358132134fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:main.fibonacci(0x18348040, 0x18348080) /tmp/compile42.go:12 +0xf9main.main() /tmp/compile42.go:27 +0x11c錯誤從何而來?
2 回答

HUH函數(shù)
TA貢獻1836條經(jīng)驗 獲得超4個贊
在第二種情況下,您將兩次從通道中獲取值。每次執(zhí)行類似 <-channel 之類的操作時,都會從 channel 中彈出一個值。
因此程序無限期地在線等待
fmt.Println(<-quit)
但幸運的是,go 足夠聰明,可以檢測到這種情況,并因錯誤而恐慌“所有 goroutine 都睡著了——死鎖! ”

一只斗牛犬
TA貢獻1784條經(jīng)驗 獲得超2個贊
線
fmt.Println(<-quit)
根據(jù)您擁有的代碼,正在等待通道上的另一個值,該值永遠不會出現(xiàn)。
您必須記住選擇之前的行:
case s := <-quit
已經(jīng)從頻道中刪除了退出值。
因此它永遠不會完成。
- 2 回答
- 0 關(guān)注
- 214 瀏覽
添加回答
舉報
0/150
提交
取消