Go从入门到精通——带缓冲的通道
带缓冲的通道
在无缓冲通道的基础上,为通道增加一个有限大小的存储空间形成带缓冲通道。
带缓冲通道在发送时无需等待接收方接收即可完成发送过程,并且不会发生阻塞,只有当存储空间满时,才会发生阻塞。
带缓冲通道有数据时,接收方将不会发生阻塞,直到通道中没有数据可读时,通道将会再读阻塞。
1、创建带缓冲通道
格式如下:
1 | 通道实例 := make( chan 通道类型, 缓冲大小) |
- 通道类型:和无缓冲通道用法一致,影响通道发送和接收的数据类型。
- 缓冲大小:决定通道最多可以保存的元素数量。
- 通道实例:被创建出的通道实例。
举个例子来理解带缓冲通道的用法,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import "fmt" func main() { //创建一个3个元素缓冲大小的整型通道 ch := make( chan int, 3) //查看当前通道的大小 fmt.Println(len(ch)) //发送3个整型元素到通道 ch <- 1 ch <- 2 ch <- 3 //查看当前通道大小 fmt.Println(len(ch)) } |
2、阻塞条件
带缓冲通道在很多特性上和无缓冲通道是类型的。无缓冲通道可以看作是长度永远是 0 的带缓冲通道。因此根据这个特性,带缓冲通道在下面列举的情况下依然会发生阻塞:
-
- 带缓冲通道被填满时,尝试再次发送数据时发生阻塞。
- 带缓冲通道为空时,尝试接收数据时发生阻塞。
提示:
1 2 | 为什么 Go 语言对通道要限制长度,而不是提供无限长度的通道? 因为通道一方提供数据,一方接收数据。如果一方的数据供给速度大于另外一方接收的速度,会造成内存不断膨胀而应用崩溃。因此限制通道的长度有利于约束数据提供方的供给速度,供给数据量必须在接收方处理量+通道长度的范围以内,才能正常地处理数据。 |
分类:
Go专题精讲
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具