package ctx import ( "context" "net/http" ) // UserContext 用户上下文 type RequestContext struct { TraceID string `json:"trace_id"` ServiceName string `json:"service_name"` InstanceName string `json:"instance_name"` TenantID string `json:"tenant_id"` UserID string `json:"user_id"` } // 内部key,不会和其他包冲突 type ctxKey struct{} var loggerKey = ctxKey{} // Save RequestContext func SaveContext(r *http.Request, requestContext *RequestContext) *http.Request { ctx := context.WithValue(r.Context(), loggerKey, requestContext) return r.WithContext(ctx) } // GetContext 从请求获取RequestContext func GetContext(r *http.Request) *RequestContext { if r == nil { return &RequestContext{} } if v := r.Context().Value(loggerKey); v != nil { // 修正:类型断言为 *RequestContext if loggerCtx, ok := v.(*RequestContext); ok { return loggerCtx } } return &RequestContext{} } func GetContextTest() *RequestContext { return &RequestContext{ TraceID: "test-TTraceID", TenantID: "test-TenantID", ServiceName: "test-ServiceName", InstanceName: "test-InstanceName", UserID: "test-UserID", } }