代码之家  ›  专栏  ›  技术社区  ›  ahmet alp balkan

检查:有区别吗?

go
  •  0
  • ahmet alp balkan  · 技术社区  · 5 年前

    我需要检查上下文是否已关闭。

    go func(){
        for {
             if ctx.Err() != nil { return }
             // do work
        }
    }()
    

    go func(){
        for {
             select {
                case <-ctx.Done():
                    return
                default:
             }
             // do work
        }
    }()
    

    我猜检查ctx.Err()对于并发访问是安全的 https://golang.org/src/context/context.go#L370

    0 回复  |  直到 5 年前
        1
  •  2
  •   Hymns For Disco Jack    5 年前

    从 context.Context documentation :

    如果关闭了Done,Err将返回一个非nil错误,解释原因

    Done 关门了。根据done通道的约定,它们应该永远关闭,并且永远不会发送任何值,我们可以说您的第二个示例也在检查 关门了。

    因此,我们可以说这两个代码示例在功能上是等价的。我们之所以有不同的检查方法,是因为每种方法都有一些好处:

    • Err() 是立即检查,并提供错误信息。
    • Done() select 案例