关于select的case若2个以上同时满足时, 会随机选择一个, 其是否会造成程序的不严谨.

func AAA(ctx context.Context, out chan<- Value) error {
                    for {
                         v, err := BBB(ctx)
                         if err != nil {
                            return err
                         }
                        select {
                            case <-ctx.Done():
                                return ctx.Err()
                            case out <- v:
                        }
                        }
        }

假设: CHAN的缓冲区为无限大!
这个是官方包的范例, 走到select这里, 若cxt被取消, (假设chan的缓冲区无限大), 那么两个case必然会同时满足, 随机选择一个case, 那么逻辑上是否非常不严谨了, 该如何理解呢?
若涉及到敏感操作, 这种select似乎失去意义了.

共 2 个回复


better0332

没有不严谨,既然同时满足只能选一个,这个结果必然是可以接受的

# 0

zxfonline

不是还有defaut逻辑嘛,你可以嵌套使用优先级高的在select case中处理,再在defaut中再处理一次

# 1