首頁 >後端開發 >Golang >如何有效地將上下文傳遞給 Golang 中的中介軟體和處理程序?

如何有效地將上下文傳遞給 Golang 中的中介軟體和處理程序?

Barbara Streisand
Barbara Streisand原創
2024-11-10 10:36:02315瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn