Go HTTP ハンドラーでコンテキスト値を安全に操作するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-19 07:02:03
オリジナル
641 人が閲覧しました

How to Safely Manipulate Context Values in Go HTTP Handlers?

HTTP ハンドラーでのコンテキスト値の操作

HTTP ハンドラー内でコンテキスト値を設定することは、リクエスト ハンドラー間でデータを共有するために重要です。 Go の HTTP パッケージでは、ハンドラーの登録に http.HandleFunc 関数がよく使用されます。ただし、*r = *r.WithContext(ctx) を使用してコンテキスト値を設定するアプローチには懸念が生じます。

推奨アプローチ

リクエスト オブジェクトの上書きを避けるため、予期しない動作が発生する可能性があるため、変更されたコンテキスト値を含むリクエストの新しい浅いコピーを返すことが最善です。

func setValue(r *http.Request, val string) *http.Request {
  return r.WithContext(context.WithValue(r.Context(), myContext, val))
}

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    r = setValue(r, "foobar")
})
ログイン後にコピー

このアプローチにより、元のリクエスト オブジェクトは変更されず、更新されたコンテキストが確実に反映されます。

更新されたリクエストの受け渡し

ハンドラーが別のハンドラーを呼び出す必要がある場合、更新されたリクエスト オブジェクトを新しいハンドラーに渡すことが重要です。そうしないと、変更されたコンテキスト値を後続のハンドラーで使用できなくなります。

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    r = setValue(r, "foobar")
    someOtherHandler.ServeHTTP(w, r)
})
ログイン後にコピー

これらのベスト プラクティスに従うことで、HTTP ハンドラー内でコンテキスト値を効果的に管理でき、効率的なデータ共有とリクエスト ハンドラー間のシームレスな移行が可能になります。 .

以上がGo HTTP ハンドラーでコンテキスト値を安全に操作するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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