我无法理解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()
。那么,有什么意义呢?
答案 0 :(得分:3)
上下文可能会取消Do
调用。 case <-ctx.Done()
明确地确定发生了这种情况。
实际上,我们可以假设调用Do
将返回一个nil
http.Response
,并且函数f
随后将返回一个错误。但是我们不知道为什么f
收到nil
http.Response
作为输入参数。
当case err := <-c:
内部产生错误时,指令f
处理该情况。
答案 1 :(得分:1)
这并不等同于仅等待<-c
。关闭上下文后,该示例将返回一个不同的值(ctx.Err()
。