在 Go 语言中,Channel 既可以是同步的,也可以是异步的,这主要取决于它是无缓冲的(unbuffered)还是有缓冲的(buffered)。下面这个表格汇总了它们的核心区别:
特性 | 无缓冲 Channel (同步) | 有缓冲 Channel (异步) |
---|---|---|
创建方式 | ch := make(chan int) |
ch := make(chan int, capacity) (capacity > 0) |
操作特性 | 发送和接收必须同时准备就绪,否则阻塞 | 发送在缓冲区未满时不阻塞;接收在缓冲区非空时不阻塞 |
通信方式 | 同步通信,强调 goroutine 间的直接协作与同步 | 异步通信,允许发送和接收在时间上解耦 |
阻塞行为 | 发送阻塞直到被接收;接收阻塞直到有数据 | 发送阻塞仅当缓冲区满;接收阻塞仅当缓冲区空 |
典型应用场景 | 保证数据即时交换、协调 goroutine 执行顺序、同步信号传递 | 解耦生产者和消费者、平滑处理速率波动、实现简单队列或资源池 |
无缓冲 Channel 的创建方式是 make(chan Type)
。在这种模式下:
- 发送操作(
ch <- value
)会一直阻塞,直到另一个 goroutine 在同一个 channel 上执行了接收操作(<-ch
)。 - 接收操作也会一直阻塞,直到另一个 goroutine 在同一个 channel 上执行了发送操作。