在 Go 中,上下文提供了一种控制和取消操作的机制。它们允许通过 goroutine 和 HTTP 请求传播取消信号。
在上下文中使用 HTTP 请求时,正确处理取消至关重要。在 Go 1.9 中,尝试使用 err == context.Canceled 检查请求是否被取消可能会导致错误的结果。
在 Go 1.13 中:
检查取消的首选方法是使用新的错误。Is 函数:
ctx, cancel := context.WithCancel(context.Background()) cancel() r, _ := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil) _, err := http.DefaultClient.Do(r) log.Println(errors.Is(err, context.Canceled)) // Prints true
errors.Is 检查错误链,如果链中的任何错误与提供的上下文匹配,则返回 true .已取消错误。
在 Go 1.9-1.12 中:
对于早期版本的 Go,您可以使用以下解决方法:
type canceledErr struct { error } func (e *canceledErr) Cancelled() bool { return e.Error() == "context canceled" } 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) ch <- &canceledErr{err} }() cancel() log.Println((<-ch).Cancelled()) // Prints true }
此解决方法创建一个自定义错误类型canceledErr,它嵌入包装的错误并提供Cancelled() 方法来检查上下文取消。
以上是Go 中如何检查 HTTP 请求是否被取消?的详细内容。更多信息请关注PHP中文网其他相关文章!