登录
首页 >  Golang >  Go问答

等待结果,取消上下文

来源:stackoverflow

时间:2024-02-20 22:33:24 335浏览 收藏

大家好,我们又见面了啊~本文《等待结果,取消上下文》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我无法理解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 方法返回一个充当取消信号的通道 代表上下文运行的函数:当通道处于 关闭后,函数应放弃其工作并返回。

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


解决方案


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

事实上,我们可以假设 Do 调用将返回 nil http.Response,并且函数 f 在发生这种情况时将返回错误。但我们不知道为什么 f 收到 nil http.Response 作为输入参数。

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

今天关于《等待结果,取消上下文》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>