我的问题来自于尝试读取频道(如果可以)或编写(如果可以)使用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 回答
慕桂英546537
TA贡献1848条经验 获得超10个赞
无缓冲通道意味着从通道读取和向通道写入是阻塞的。
在一份select
声明中:
如果其他 goroutine 当前被阻止写入通道,则读取将起作用
如果其他 goroutine 当前在读取通道时被阻塞,则写入将起作用
否则将
default
执行案例,这在您的案例 A 中发生。
- 3 回答
- 0 关注
- 411 浏览
添加回答
举报
0/150
提交
取消