ホームページ >バックエンド開発 >Golang >Go でリクエストのキャンセルを検出するにはどうすればよいですか?

Go でリクエストのキャンセルを検出するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-07 18:23:02516ブラウズ

How to Detect Request Cancellation in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。