管道分為帶緩存的和不帶緩存的
帶緩存的,make的時候指定大小,且管道未關閉狀态,如果一直取不到值,發生錯誤
func main() {
chan1 := make(chan int)
chan2 := make(chan int)
go func() {
chan2 <- 1
chan1 <- 2
}()
<- chan1
}
fatal error: all goroutines are asleep - deadlock!
一直等待,chan2,發生死鎖
func main() {
ch := make(chan int)
ch <- 1
}
func main() {
ch := make(chan int)
<-ch
}
無緩沖管道不存儲值,無論是傳值還是取值都會阻塞。這裡隻有一個主程的情況下,
第一段代碼是阻塞在傳值,
第二段代碼是阻塞在取值。
一直卡住主協程,系統一直在等待,是以系統判斷為死鎖,最終報deadlock錯誤并結束程式。
func main() {
chan1 := make(chan int, 2)
chan1 <- 1
chan1 <- 2
for ch := range chan1 {
fmt.Println(ch)
}
}
也會發生死鎖,如果管道全部取完後,在去取,相當于沒有緩存的管道了,一直等待。
綜上所訴:
- 全部取出的管道,再取會出現死鎖
- 已經塞滿的管道,在塞也會死鎖