Golang Go语言中unbuffered channel和只有一个元素的buffered channel有啥区别

发布于 1周前 作者 itying888 来自 Go语言

比如:

sema = make(chan struct{}, 1)

和 sema = make(chan struct{})

都是只能放一个元素,读取之前再放的话就会等待


Golang Go语言中unbuffered channel和只有一个元素的buffered channel有啥区别
3 回复

unbuffered channel 第一个元素都放不进去吧,会卡到有人读才行

https://go.dev/play/p/UJGaZDcKzDW

更多关于Golang Go语言中unbuffered channel和只有一个元素的buffered channel有啥区别的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


unbuffered channel 会卡发送者,buffer channel 不卡

在Go语言中,unbuffered channel和只有一个元素的buffered channel虽然看起来相似,但在使用和性能上存在一些关键区别。

  1. 工作原理

    • Unbuffered Channel:无缓冲通道在没有接收者准备好接收数据时,发送操作会阻塞,直到接收者准备好。同样,如果通道为空,接收操作也会阻塞,直到有数据发送过来。
    • One-Element Buffered Channel:具有一个元素的缓冲通道允许发送者在没有接收者时发送一个数据项而不会立即阻塞,这个数据项会存储在缓冲区中。接收者可以在没有发送者时从缓冲区中读取这个数据项而不会阻塞。然而,一旦缓冲区满了(在这个情况下是只有一个元素),发送操作会阻塞,直到接收者读取数据。同样,如果缓冲区为空,接收操作也会阻塞。
  2. 使用场景

    • 无缓冲通道通常用于需要严格同步的场景,确保发送和接收操作紧密配合。
    • 一个元素的缓冲通道可以在某些情况下提供轻微的解耦,允许发送和接收操作在时间上稍有错开,但仍然保持数据的顺序性和同步性。
  3. 性能

    • 在高频率的数据传输中,无缓冲通道可能导致更多的上下文切换和阻塞,因为它们需要发送者和接收者紧密配合。
    • 一个元素的缓冲通道可以减少这种阻塞,但由于缓冲区非常小,其性能提升可能有限。

综上所述,选择哪种通道取决于具体的应用场景和对性能的要求。

回到顶部