有人可以向我解釋為什么第一個代碼運行但第二個代碼失敗?
第一 :
func main() {
channel := make(chan int)
go demo(channel)
num := <-channel
println(num)
}
func demo(channel chan int) {
channel <- 2
}
第二個:
func main() {
demo()
}
func demo() {
channel := make(chan int)
channel <- 2
num := <-channel
println(num)
}
在第二個中,我從演示函式中的通道獲取輸入,但它仍然會造成死鎖,有人可以簡要解釋一下。我能看到的是,當我在同一范圍內呼叫通道時,它會導致問題。
uj5u.com熱心網友回復:
你的通道沒有緩沖,所以寫入它會阻塞,因為沒有其他 goroutine 可以從中讀取。
進行此更改,它將運行:
channel := make(chan int, 1)
uj5u.com熱心網友回復:
在第一種情況下,寫入通道是在一個單獨的 goroutine 中。當主 goroutine 阻塞了從通道讀取時,仍然有一個 goroutine 可以寫入通道,因此不是死鎖。最終 goroutine 寫入通道并且程式完成。
第二種情況,寫入channel塊,并且沒有其他goroutine在運行,所以是死鎖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404465.html
標籤:
