首页  >  文章  >  后端开发  >  如何在 Go 中检查请求取消?

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-08 08:55:02345浏览

How to Check for Request Cancellation in Go?

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn