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