在Go中使用通道执行非阻塞select语句的首选方法是什么

时间:2017-09-12 20:04:03

标签: go channels

这是我想要做的一个例子

func (zoo *Zoo) feedAnimals(food Food) {
    for animal := range zoo.Animals {
        select {
        case animal.EatChan() <- food:
        default: // Do nothing
        }
    }
}

动物的EatChan有一个小的缓冲区,有时候feedAnimals被调用的频率比一些动物可以食用的速度更频繁。当发生这种情况时,如果我在default块中省略select语句,则select语句将阻止for loop,其他饥饿的动物无法获取食物。所以我宁愿跳过已满的动物(即通道达到其容量。)

但是,空default让我觉得很奇怪。有一个更好的方法吗?

1 个答案:

答案 0 :(得分:2)

  

然而,对我来说,一个空的默认感觉很奇怪。

不应该。

  

有更好的方法吗?

没有

您已经正确地完成了这项工作。空的默认值不是&#34;什么都不做&#34;声明,它不会阻止&#34;阻止&#34;声明。这只是非阻塞选择如何工作的语义。

相关问题