ホームページ >バックエンド開発 >Golang >Golang でミドルウェアとハ​​ンドラーにコンテキストを効果的に渡すにはどうすればよいですか?

Golang でミドルウェアとハ​​ンドラーにコンテキストを効果的に渡すにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-10 10:36:02317ブラウズ

How to Effectively Pass Context to Middleware and Handlers in Golang?

Golang リクエストのコンテキストをミドルウェアに渡す

Golang 1.7 で導入されたコンテキスト メカニズムを理解するのは難しい場合があります。この記事は、コンテキストをミドルウェアおよびハンドラー関数に効果的に渡す方法を明確にすることを目的としています。

コンテキストの導出

Go 同時実行パターンのブログ投稿で説明したように、コンテキストを導出できます。背景コンテキストから。 Request オブジェクトには、Context メソッドと WithContext メソッドも提供されます。これにより、特定の目的に合わせてカスタマイズされたコンテキストを作成できます。

タイムアウトの実装

リクエスト ハンドラー内で、WithTimeout メソッドを使用してタイムアウトを指定できます。これにより、タイムアウトが設定された派生コンテキストが作成されます。

ctx, cancel := context.WithTimeout(r.Context(), time.Duration(60*time.Second))
defer cancel()
r = r.WithContext(ctx)

コンテキストへのユーザー情報の追加

認可チェッカーでは、事前にコンテキストにユーザー情報を追加できます。 ServeHTTP の呼び出し。

type ContextKey string

const ContextUserKey ContextKey = "user"

// ...

ctx := context.WithValue(r.Context(), ContextUserKey, "theuser")
h.ServeHTTP(w, r.WithContext(ctx))

コンテキストからのユーザー情報の取得

ハンドラー内から、コンテキストからユーザー情報にアクセスできます。

user := r.Context().Value(ContextUserKey)
doSomethingForThisUser(user.(string))

コンテキストによるミドルウェアのチェーン

メイン関数では、util.UseMiddleware を使用してミドルウェア ハンドラーをチェーンし、各ハンドラー間でコンテキストを渡すことができます。

router.Handle("/hello", util.UseMiddleware(authCheck, HandlerW, ...))

結論

これらの手順に従うことで、Golang リクエストのコンテキストをミドルウェアやハンドラー関数に効果的に渡し、柔軟性を強化し、コード内のスレッドの安全性を維持できます。

以上がGolang でミドルウェアとハ​​ンドラーにコンテキストを効果的に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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