2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
要使用您構(gòu)建的內(nèi)容,您必須使用類型斷言:
rctx:=request.Context().(RequestContext)
如果您有一個(gè)以與您相同的方式包裝上下文的中間件,這將中斷。
另一種方法是使用基本上下文,并添加帶有私鑰的助手來訪問值:
type reqKey int
const key reqKey=iota
type RequestData struct {
UserID uuid.UUID
Now time.Time
}
func ContextWithRequest(ctx context.Context,req requestData) context.Context {
return context.WithValue(ctx,key,req)
}
func GetRequest(ctx context) RequestData {
x:=ctx.Value(key)
if x!=nil {
return x.(RequestData)
}
return RequestData{}
}
當(dāng)然,如果要更改RequestData,則需要添加指向上下文的指針。

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
這就是我現(xiàn)在在我的應(yīng)用程序中使用的。我使用簡單的 settters 和 getter 從上下文中檢索值。
import (
"context"
"github.com/google/uuid"
)
const userIdContextKey = "user_id" // type is uuid
func addUserIdToContext(ctx context.Context, user uuid.UUID) context.Context {
return context.WithValue(ctx, UserIdContextKey, user)
}
func userIDFromContext(ctx context.Context) uuid.UUID {
return ctx.Value(UserIdContextKey).(uuid.UUID)
}
然后在一個(gè)中間件中,我已經(jīng)檢索了 userId,我通過將上下文和用戶 ID 傳遞給addUserIdToContext()函數(shù)來將值添加到上下文中。
ctx := addUserIdToContext(r.Context(), userId)
當(dāng)我想從上下文中檢索用戶時(shí),我只需要調(diào)用userIDFromContext(ctx)并將請求上下文傳遞給它。
func CreateResource(w http.ResponseWriter, r *http.Request) {
createdBy := userIDFromContext(r.Context())
// do something with createdBy
}
我知道這不是最優(yōu)雅甚至類型安全的解決方案,但是,嘿,因?yàn)槲艺趪L試構(gòu)建它,它工作得很好。
- 2 回答
- 0 關(guān)注
- 128 瀏覽
添加回答
舉報(bào)