我的问题来自于尝试读取频道(如果可以)或编写(如果可以)使用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")
}
}
一个输出:
Neither
Neither
Neither
Neither
Neither
(删除default案例会导致死锁!!)
现在看到操场 B:
chanFoo := make(chan bool, 1) // the only difference is the buffer size of 1
for i := 0; i < 5; i++ {
select {
case <-chanFoo:
fmt.Println("Read")
case chanFoo <- true:
fmt.Println("Write")
default:
fmt.Println("Neither")
}
}
B输出:
Write
Read
Write
Read
Write
就我而言,B 输出是我想要的。无缓冲通道有什么好处?我在 golang.org 上看到的所有示例似乎都使用它们一次发送一个信号/值(这是我所需要的)——但就像在操场 A 中一样,通道永远不会被读取或写入。我对频道的理解在这里缺少什么?
慕森卡
慕桂英546537
相关分类