我正在學習頻道,下面是我嘗試過的測試,但發生了死鎖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個贊
你有一個select
with default
,這意味著如果沒有任何通信操作準備就緒,則select
不會等待,不會阻塞,而是default
立即執行。通道是無緩沖的,所以它上面的發送還沒有準備好(因為沒有準備好的接收器——main
正在休眠)。
因此,一旦 sleep 結束main
,它就會嘗試從通道接收,但到那時沒有人嘗試發送。僵局。
- 1 回答
- 0 關注
- 92 瀏覽
添加回答
舉報
0/150
取消