Go語言 channel 管道 阻塞 死鎖 經典問題


建議閱讀:14.2協程間的信道

問題:為什么代碼1會報死鎖的錯誤,而代碼2不會報錯?

代碼1:

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int)
    ch <- 1
    fmt.Println(<-ch) // 1

}

代碼2:

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int, 1)
    ch <- 1
    fmt.Println(<-ch) // 1

}

解答:

因為代碼1的channel沒有buffer,而代碼2的channel設置了buffer為1。
沒有buffer的channel只能通過另一個goroutine去讀,否則就阻塞了。

可以理解成,代碼1執行到 ch <- 1 時只有main一個“協程”(其實是線程),並沒有其他協程進行接收 ch 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM