github.com/wfusion/gofusion@v1.1.14/common/utils/context.go (about) 1 package utils 2 3 import ( 4 "context" 5 "reflect" 6 ) 7 8 // GetCtxAny with a default value 9 func GetCtxAny[T any](ctx context.Context, key string, args ...T) (val T) { 10 if v := ctx.Value(key); v != nil { 11 return v.(T) 12 } 13 if len(args) == 0 { 14 return 15 } 16 return args[0] 17 } 18 19 // SetCtxAny with any value 20 func SetCtxAny[T any](ctx context.Context, key string, val T) context.Context { 21 return context.WithValue(ctx, key, val) 22 } 23 24 // TravelCtx context parent traversal 25 func TravelCtx(child context.Context, fn func(ctx context.Context) bool) { 26 v := reflect.ValueOf(child) 27 for p := v; p.IsValid() && p.CanInterface(); p = p.FieldByName("Context") { 28 parent, ok := p.Interface().(context.Context) 29 if !ok || parent == nil || fn(parent) { 30 break 31 } 32 if p = reflect.Indirect(p); p.Kind() != reflect.Struct { 33 break 34 } 35 } 36 }