GO语言基础教程(151)Go channel(通道)之有缓冲的通道:Go Channel缓冲池:别再让goroutine等得花儿都谢了!

在Go语言的并发世界,有缓冲通道就像快递柜,让goroutine之间的交付不再需要苦苦等待。

在Go语言中,channel(通道)是goroutine(Go程)之间的通信桥梁,但你是否遇到过这样的场景:一个goroutine急着发送数据,另一个却还没准备好接收,于是发送方只能干等着?这就是有缓冲通道大显身手的时候了!它像一个快递柜,允许暂时存储数据,解放了发送和接收双方。本文将深入探索有缓冲通道的奥秘,告诉你如何正确使用这个并发编程中的利器。

有缓冲通道是什么?

简单来说,有缓冲通道是一种带有存储空间的channel,它能在没有立即接收者时,暂时保存发送的数据。

与无缓冲通道的“面对面交付”不同,有缓冲通道更像是一个快递站,发送方可以放下数据就走,接收方可以随时来取。

创建有缓冲通道

创建有缓冲通道非常简单,只需在使用make函数时指定缓冲区大小:

ch := make(chan int, 3) // 创建一个能存储3个整数的有缓冲通道

这行代码创建了一个整数类型的有缓冲通道,其缓冲区可以容纳3个元素。

有缓冲通道如何工作?

有缓冲通道的行为特点可以用以下几个关键点概括:

  • 发送操作:当缓冲区未满时,发送操作会立即完成,数据被存入缓冲区。当缓冲区已满时,发送操作会阻塞,直到有其他goroutine从通道接收数据腾出空间。
  • 接收操作:当缓冲区非空时,接收操作会立即完成,从缓冲区取出数据。当缓冲区为空时,接收操作会阻塞,直到有其他goroutine向通道发送数据。
  • 异步性:有缓冲通道允许发送和接收操作在一定程度上解耦,两者不需要同时准备就绪。

基本使用示例

下面是一个简单的示例,演示了有缓冲通道的基本使用:

package main

import "fmt"

func main() {
    // 创建缓冲大小为2的通道
    messages := make(chan string, 2)
    
    // 向通道发送数据,不会阻塞
    messages <- "buffered"
    messages <- "channel"
    
    // 从通道接收数据
    fmt.Println(<-messages
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值