无缓冲Channel本质是同步通信——发送和接收必须同时准备好,否则阻塞。它是一种“握手”机制,常用于两个goroutine之间做精准的同步信号。有缓冲Channel是异步通信——生产者可以一口气往缓冲区写,消费者可以慢慢读,解耦了生产和消费的节奏。但缓冲区满了依然会阻塞,千万别把缓冲当“存储用”。
示例:
无缓冲:ch := make(chan int),发送方和接收方必须配对才能继续;
有缓冲:ch := make(chan int, 3),可连续发送3次不阻塞,第4次才阻塞。
关于select:select会随机选择一个可执行的case(不是顺序的),这是Go语言故意为之,避免饥饿问题。