上下文取消后等待功能结果

时间:2019-12-18 08:54:53

标签: go

我无法理解Go Concurrency Patterns: Context

中该示例的逻辑
func httpDo(ctx context.Context, req *http.Request, f func(*http.Response, error) error) error {
    // Run the HTTP request in a goroutine and pass the response to f.
    c := make(chan error, 1)
    req = req.WithContext(ctx)
    go func() { c <- f(http.DefaultClient.Do(req)) }()
    select {
    case <-ctx.Done():
        <-c // Wait for f to return.
        return ctx.Err()
    case err := <-c:
        return err
    }
}

在此之前,有人说:

  

Done方法返回一个通道,该通道充当取消信号   代表Context运行的函数:   关闭后,功能应放弃工作并返回。

它看起来只相当于等待<-c,而根本没有等待case <-ctx.Done()。那么,有什么意义呢?

2 个答案:

答案 0 :(得分:3)

上下文可能会取消Do调用。 case <-ctx.Done()明确地确定发生了这种情况。

实际上,我们可以假设调用Do将返回一个nil http.Response,并且函数f随后将返回一个错误。但是我们不知道为什么f收到nil http.Response作为输入参数。

case err := <-c:内部产生错误时,指令f处理该情况。

答案 1 :(得分:1)

这并不等同于仅等待<-c。关闭上下文后,该示例将返回一个不同的值(ctx.Err()