默认情况下,通道是 无缓冲 的,这意味着它们只有在有相应的接收者(<-chan)准备好接收发送的值时,才会接受发送操作(chan <-)。如果没有接收者准备好接收,发送操作会阻塞,直到接收者准备好。 而 有缓冲的通道 可以接受一定数量的值,即使没有立即的接收者。这些值会被保存在通道的缓冲区中,直到有接收者接收这些值或者缓冲区被填满。
package main
import "fmt"
func main() {
// 在下面的代码中,我们创建了一个能够缓冲最多 2 个字符串值的通道。这个缓冲区允许我们在没有立即接收者的情况下发送两个值,而不会阻塞,直到缓冲区满。
messages := make(chan string, 2)
// 由于这个通道是 **有缓冲的**,我们可以在没有相应的并发接收操作的情况下,向通道发送这些值。也就是说,即使没有立即的接收者准备好接收,发送的值会被存储在通道的缓冲区中,直到接收者准备好接收。
messages <- "buffered"
messages <- "channel"
// 稍后我们可以像往常一样接收这两个值。
fmt.Println(<-messages)
fmt.Println(<-messages)
}运行结果:
$ go run channel-buffering.go
buffered
channel原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。