在 Go 中检查请求取消
在 Go 中,检查请求是否被取消对于优雅地处理异步操作至关重要。一个简单的解决方案是监视请求的上下文,其中包含取消信号。
考虑以下代码:
package main import ( "context" "log" "net/http" ) func main() { r, _ := http.NewRequest("GET", "http://example.com", nil) ctx, cancel := context.WithCancel(context.Background()) r = r.WithContext(ctx) ch := make(chan bool) go func() { _, err := http.DefaultClient.Do(r) log.Println(err == context.Canceled) ch <- true }() cancel() <-ch }
此代码尝试通过比较 Do( 返回的错误来确定请求取消) 与上下文。已取消。然而,在 Go 1.9 中,令人惊讶的是,它打印 false 而不是 true。
正确方法
对于 1.13 之前的 Go 版本,检查取消的正确方法是使用 context.Err() 并将其返回值与 context.Canceled 进行比较:
if r.Context().Err() == context.Canceled { // Request was cancelled }
Go 1.13
在 Go 1.13 及更高版本中,检查取消变得均匀引入errors.Is()函数更方便。此函数允许您检查错误是否与另一种错误类型匹配,即使它包装在多个层中:
if errors.Is(err, context.Canceled) { // Request was cancelled }
即使其他错误包装在 context.Canceled 中,此方法也可确保准确的取消检测。
以上是如何在 Go 中检查请求取消?的详细内容。更多信息请关注PHP中文网其他相关文章!