脚本专栏 
首页 > 脚本专栏 > 浏览文章

详解go语言 make(chan int, 1) 和 make (chan int) 的区别

(编辑:jimmy 日期: 2025/2/1 浏览:3 次 )

遇到golang channel 的一个问题:发现go 协程读取channel 数据 并没有按照预期进行协作执行。

经过查资料:

使用channel 操作不当导致,channel分 有缓冲区 和 无缓冲区 , 以下是两者的区别。

无缓冲区channel

用make(chan int) 创建的chan, 是无缓冲区的, send 数据到chan 时,在没有协程取出数据的情况下, 会阻塞当前协程的运行。ch <- 后面的代码就不会再运行,直到channel 的数据被接收,当前协程才会继续往下执行。

ch := make(chan int) // 创建无缓冲channel

go func() {
  fmt.Println("time sleep 5 second...")
  time.Sleep(5 * time.Second)
  <-ch
}()
h
fmt.Println("即将阻塞...")
ch <-1  // 协程将会阻塞,等待数据被读取
fmt.Println("ch 数据被消费,主协程退出")

有缓冲区channel

channel 的缓冲区为1,向channel 发送第一个数据,主协程不会退出。发送第二个时候,缓冲区已经满了, 此时阻塞主协程。

ch := make(chan int, 1) // 创建有缓冲channel
go func() {
  fmt.Println("time sleep 5 second...")
  time.Sleep(5 * time.Second)
  <-ch
}()
ch <-1  // 协程不会阻塞,等待数据被读取
fmt.Println("第二次发送数据到channel, 即将阻塞")
ch <-1  // 第二次发送数据到channel, 在数据没有被读取之前,因为缓冲区满了, 所以会阻塞主协程。
fmt.Println("ch 数据被消费,主协程退出")

总结: 在创建channel的时候, 要注意是否需要缓冲区。有缓冲区时:在不超过缓冲区大小时,不会出现 发送方阻塞. 无缓冲区时: 只要channel 数据没有被拿走,始终会阻塞发送方。

以上所述是小编给大家介绍的详解go语言 make(chan int, 1) 和 make (chan int) 的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

上一篇:golang 生成二维码海报的实现代码
下一篇:如何控制Go编码JSON数据时的行为(问题及解决方案)
一句话新闻
微软与英特尔等合作伙伴联合定义“AI PC”:键盘需配有Copilot物理按键
几个月来,英特尔、微软、AMD和其它厂商都在共同推动“AI PC”的想法,朝着更多的AI功能迈进。在近日,英特尔在台北举行的开发者活动中,也宣布了关于AI PC加速计划、新的PC开发者计划和独立硬件供应商计划。
在此次发布会上,英特尔还发布了全新的全新的酷睿Ultra Meteor Lake NUC开发套件,以及联合微软等合作伙伴联合定义“AI PC”的定义标准。
友情链接:杰晶网络 DDR爱好者之家 南强小屋 黑松山资源网 白云城资源网 站点导航 SiteMap