为了账号安全,请及时绑定邮箱和手机立即绑定

make(chan bool) 与 make(chan bool, 1) 的行为有何不同?

make(chan bool) 与 make(chan bool, 1) 的行为有何不同?

Go
吃鸡游戏 2021-06-30 17:58:32
我的问题来自于尝试读取频道(如果可以)或编写(如果可以)使用select语句。我知道指定的通道make(chan bool, 1)是缓冲的,我的部分问题是它之间的区别是什么,并且make(chan bool)-此页面所说的与make(chan bool, 0)- 可以容纳 0 值的通道的意义是什么它?见操场A:chanFoo := make(chan bool)for i := 0; i < 5; i++ {    select {    case <-chanFoo:        fmt.Println("Read")    case chanFoo <- true:        fmt.Println("Write")    default:        fmt.Println("Neither")    }}一个输出:NeitherNeitherNeitherNeitherNeither(删除default案例会导致死锁!!)现在看到操场 B:chanFoo := make(chan bool, 1)   // the only difference is the buffer size of 1for i := 0; i < 5; i++ {    select {    case <-chanFoo:        fmt.Println("Read")    case chanFoo <- true:        fmt.Println("Write")    default:        fmt.Println("Neither")    }}B输出:WriteReadWriteReadWrite就我而言,B 输出是我想要的。无缓冲通道有什么好处?我在 golang.org 上看到的所有示例似乎都使用它们一次发送一个信号/值(这是我所需要的)——但就像在操场 A 中一样,通道永远不会被读取或写入。我对频道的理解在这里缺少什么?
查看完整描述

3 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

可以容纳 0 个值的通道的要点是什么

首先我想指出,这里的第二个参数表示缓冲区大小,所以它只是一个没有缓冲区的通道(无缓冲通道)。

其实这就是你的问题产生的原因。无缓冲通道仅在有人阻止读取时才可写,这意味着您将有一些协程可以使用——而不是单个协程。

另请参阅Go 内存模型

来自无缓冲通道的接收发生在该通道上的发送完成之前。


查看完整回答
反对 回复 2021-07-12
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

无缓冲通道意味着从通道读取和向通道写入是阻塞的。

在一份select声明中:

  • 如果其他 goroutine 当前被阻止写入通道,则读取将起作用

  • 如果其他 goroutine 当前在读取通道时被阻塞,则写入将起作用

  • 否则将default执行案例,这在您的案例 A 中发生。


查看完整回答
反对 回复 2021-07-12
  • 3 回答
  • 0 关注
  • 411 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信