ホームページ  >  記事  >  バックエンド開発  >  Go で HTTP リクエストがキャンセルされたかどうかを確認する方法

Go で HTTP リクエストがキャンセルされたかどうかを確認する方法

DDD
DDDオリジナル
2024-11-07 14:54:03334ブラウズ

How to Check if an HTTP Request Was Cancelled in Go?

リクエストがキャンセルされたかどうかを確認する方法

コンテキストとキャンセル

Go では、コンテキストは操作を制御およびキャンセルするためのメカニズムを提供します。これらにより、ゴルーチンと 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 中国語 Web サイトの他の関連記事を参照してください。

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