Golang 中国
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似乎失去意义了.


aaaaaaaa 于 2018-01-07 22:14 修改
2 回复
better0332
#1 better0332 • 2018-01-08 00:00

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

zxfonline
#2 zxfonline • 2018-01-23 09:23

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

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。