在 Go 中,上下文提供了一種控制和取消操作的機制。它們允許透過 goroutine 和 HTTP 請求傳播取消訊號。
在上下文中使用 HTTP 請求時,正確處理取消至關重要。在 Go 1.9 中,嘗試使用 err == context.Canceled 檢查請求是否被取消可能會導致錯誤的結果。
在 Go 1.13 中:
檢查取消的首選方法是使用新錯誤。是函數:
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中文網其他相關文章!