Go中缓冲通道的用途是什么?

Go中缓冲通道的用途是什么?,go,channel,Go,Channel,我从这个问题“”了解到,如果通道被缓冲,它将不会阻塞 c := make(chan int, 1) c <- data1 // doesn't block c <- data2 // blocks until another goroutine receives from the channel c <- data3 c <- data4 c:=make(chan int,1) 这个站点有一个很好的解释:缓冲通道允许向缓冲通道添加数据的goroutine保持运行和做事,

我从这个问题“”了解到,如果通道被缓冲,它将不会阻塞

c := make(chan int, 1)
c <- data1 // doesn't block
c <- data2 // blocks until another goroutine receives from the channel
c <- data3
c <- data4
c:=make(chan int,1)

这个站点有一个很好的解释:

缓冲通道允许向缓冲通道添加数据的goroutine保持运行和做事,即使从通道读取的goroutine开始落后一点


例如,您可能有一个goroutine正在接收HTTP请求,您希望它尽可能快。不过,你也希望它能安排一些后台工作,比如发送电子邮件,这可能需要一段时间。因此HTTP goroutine只解析用户的请求,并将后台作业快速添加到缓冲通道。其他goroutine会在有时间的时候处理它。如果HTTP请求突然激增,如果缓冲区足够大,用户将不会注意到HTTP中的任何缓慢现象。

我之前读过它,它解释了如何使用缓冲通道,但没有解释为什么要使用缓冲通道。我要补充一点,指出一个好的经验法则是缓冲是提高性能的工具。永远不要犯错误,仅仅通过使用缓冲来避免死锁等,因为这是徒劳的。如果你的应用程序不能在没有缓冲的情况下死锁,那么当添加缓冲时它就不会死锁。。。但它可能跑得更快。首先设计一个简单的无死锁无缓冲网络,然后调整性能。