我正在學習頻道,下面是我嘗試過的測試,但發生了死鎖func main() { ch := make(chan int) go func() { select { case ch <- 1: fmt.Println("send suc") default: // if comment this line, it will run smoothly fmt.Println("default") } }() time.Sleep(2) // do some time consuming thing... fmt.Printf("receive val: %d", <-ch)}我預計沒有死鎖,但結果是:defaultfatal error: all goroutines are asleep - deadlock!但是如果我刪除defaultor time.Sleep(2),代碼將順利運行,結果:send sucreceive val: 1有人可以解釋為什么會發生死鎖嗎?
1 回答
弒天下
TA貢獻1818條經驗 獲得超8個贊
你有一個selectwith default,這意味著如果沒有任何通信操作準備就緒,則select 不會等待,不會阻塞,而是default立即執行。通道是無緩沖的,所以它上面的發送還沒有準備好(因為沒有準備好的接收器——main正在休眠)。
因此,一旦 sleep 結束main,它就會嘗試從通道接收,但到那時沒有人嘗試發送。僵局。
- 1 回答
- 0 關注
- 103 瀏覽
添加回答
舉報
0/150
提交
取消
