非缓冲通道:非缓冲通道在确定时没有声明容量大小,发送和接收操作会同步阻塞,直到另一端准备好。发送方和接收方必须同时就绪才能完成数据交换,否则会阻塞。常用于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