無緩衝 channel 的收送會互相等待
make(chan T)建出來的是無緩衝 channel:它不存資料,只做交接。送的一方會卡住直到有人來收,收的一方也會卡住直到有人來送——兩邊必須碰頭,這一刻叫 rendezvous。
ch := make(chan string)
ch <- "hi" // 沒有人收 → 這行就停在這裡所以 channel 除了傳資料,同時也是同步點:<-ch 回傳的那一刻,你確定對方已經把值送出來了。這讓它可以直接拿來當「等 goroutine 做完」的訊號用,不需要另外的鎖或旗標。
想要送出去不等人收,得給緩衝:
ch := make(chan string, 1) // 緩衝 1,第一次送不會卡緩衝滿了照樣卡。兩邊都卡住且沒有第三方能解時就是 deadlock——Go runtime 偵測得到,會直接 panic all goroutines are asleep - deadlock!。
相關:Channel 是 goroutine 之間的通訊管道、用 time.Sleep 等 goroutine 只是 demo 寫法