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