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

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

Mary-Kate Olsen
リリース: 2024-11-08 08:55:02
オリジナル
499 人が閲覧しました

How to Check for Request Cancellation in Go?

Go でのリクエストのキャンセルの確認

Go では、リクエストがキャンセルされたかどうかを確認することは、非同期操作を適切に処理するために不可欠です。簡単な解決策は、キャンセル信号を格納するリクエストのコンテキストを監視することです。

次のコードを考えてみましょう。

package main

import (
    "context"
    "log"
    "net/http"
)

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)
        log.Println(err == context.Canceled)
        ch <- true
    }()
    cancel()
    <-ch
}
ログイン後にコピー

このコードは、Do( によって返されたエラーを比較することによって、リクエストのキャンセルを判断しようとします。 ) コンテキストあり。キャンセルされました。しかし、Go 1.9 では、驚くべきことに true ではなく false が出力されます。

正しいアプローチ

1.13 より前の Go バージョンの場合、キャンセルを確認する適切な方法は次のとおりです。 context.Err() を使用し、その戻り値を context.Canceled:

if r.Context().Err() == context.Canceled {
    // Request was cancelled
}
ログイン後にコピー

Go 1.13

Go 1.13 以降では、キャンセルのチェックが均等になりました。 error.Is() 関数の導入でさらに便利になりました。この関数を使用すると、エラーが複数のレイヤーでラップされている場合でも、エラーが別のエラー タイプと一致するかどうかを確認できます。

if errors.Is(err, context.Canceled) {
    // Request was cancelled
}
ログイン後にコピー

このメソッドにより、他のエラーがコンテキストにラップされている場合でも、正確なキャンセル検出が保証されます。Canceled.

以上がGoでリクエストのキャンセルを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート