Go でのリクエストのキャンセルの検出
Go では、HTTP リクエストがキャンセルされたかどうかをいくつかの方法で確認できます。提供されたコード スニペットは、http.DefaultClient.Do() から返されたエラーを検査してキャンセルを確認しようとしますが、予期せず false が記録されます。
Go 1.13 のソリューション
Go バージョン 1.13 以降の場合、errors.Is 関数を活用することをお勧めします。この関数を使用すると、コンテキスト パッケージからのエラーなど、エラーが特定のタイプに一致するかどうかを確認できます。
// 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 は、エラーの原因がキャンセルされたコンテキストにあることを正確に判断し、それを確認します。リクエストが実際にキャンセルされたことを確認します。
代替アプローチ
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 中国語 Web サイトの他の関連記事を参照してください。