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

What is the preferred approach to do non-blocking select statement with channels in Go

这是我想做的事的例子

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

动物的 EatChan 有一个小的缓冲区,有时 feedAnimals 的调用速率比某些动物可以消耗食物的速率更频繁。发生这种情况时,如果我在 select 块中省略 default 语句,select 语句将阻塞 for loop 并且其他饥饿的动物无法获得食物。所以我宁愿跳过吃饱的动物(即频道已达到其容量。)

然而,有一个空的 default 对我来说感觉很奇怪。有一个更好的方法吗?

However, having an empty default feels weird to me.

不应该。

Is there a better way to do this?

没有

你已经做得很好了。空默认值不是 "do nothing" 语句,而是 "don't block" 语句。这只是非阻塞 select 工作原理的语义。