非緩沖通道:非緩沖通道在確定時沒有聲明容量大小,發送和接收操作會同步阻塞,直到另一端準備好。發送方和接收方必須同時就緒才能完成數據交換,否則會阻塞。常用于goroutine之間的同步通信。
緩沖通道:緩沖通道在確定時就聲明了容量大小,發送操作在緩沖區未滿時不會阻塞,接收操作在緩沖區非空時不會阻塞。當緩沖區滿時發送會阻塞,空時接收會阻塞。適用于異步通信或流量控制。
發送數據:使用<-將數據發送到通道
ch := make(chan int) // 非緩沖通道
chBuffered := make(chan int, 3) // 緩沖容量為3
ch <- 42 // 發送數據
接收數據:使用<- 從通道接收數據,
value := <-ch // 阻塞接收
value, ok := <-ch // 非阻塞接收,ok指示通道是否關閉
關閉通道:使用close()關閉通道,關閉后不可在發送數據
close(ch)
從已關閉的通道仍可讀取剩余數據,但需注意:
接收操作會立即返回零值,需通過第二個返回值 (ok
) 判斷通道狀態。
重復關閉或向已關閉通道發送數據會引發panic。
通道的阻塞與死鎖
非緩沖通道:無接收方的發送或無發送方的接收會導致永久阻塞。
緩沖通道:僅當緩沖區滿/空時阻塞。
關閉通道后,接收方讀取零值,發送方panic
?