無緩衝 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 寫法