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