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