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) } // Get 从请求获取RequestContext func GetContext(r *http.Request) *RequestContext { if r == nil { return &RequestContext{} } if v := r.Context().Value(loggerKey); v != nil { if loggerCtx, ok := v.(RequestContext); ok { return &loggerCtx } } return &RequestContext{} }