建議閱讀: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