首页 > 后端开发 > Golang > 如何在 Go 中检测请求取消?

如何在 Go 中检测请求取消?

DDD
发布: 2024-11-07 18:23:02
原创
539 人浏览过

How to Detect Request Cancellation in Go?

在 Go 中检测请求取消

在 Go 中,可以通过多种方式验证 HTTP 请求是否已被取消。提供的代码片段尝试通过检查从 http.DefaultClient.Do() 返回的错误来检查取消,但意外地记录为 false。

Go 1.13 的解决方案

对于 Go 版本 1.13 及更高版本,推荐的方法是利用errors.Is 函数。通过此函数,您可以检查错误是否与特定类型匹配,包括来自 context 包的错误。

// Create a canceled context
ctx, cancel := context.WithCancel(context.Background())
cancel()

// Create a request with the canceled context
r, _ := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil)

// Attempt the request, which will fail immediately due to the canceled context
_, err := http.DefaultClient.Do(r)

// Validate the error's origin using errors.Is
if errors.Is(err, context.Canceled) {
    fmt.Println("Request canceled!")
}
登录后复制

在这种情况下,errors.Is 将准确地确定 err 源自已取消的 context,从而确认请求确实被取消。

替代方法

在 Go 1.13 之前,您可以结合使用 grpc.ErrorDesc 和 context.Err() 来验证取消:

// Create a canceled context
ctx, cancel := context.WithCancel(context.Background())
cancel()

// Create a request with the canceled context
r, _ := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil)

// Attempt the request, which will fail immediately due to the canceled context
_, err := http.DefaultClient.Do(r)

// Check for a canceled context error
if grpc.ErrorDesc(err) == context.Canceled {
    fmt.Println("Request canceled!")
}
登录后复制

以上是如何在 Go 中检测请求取消?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板