diff --git a/nreflect/convert.go b/nreflect/convert.go index f883333..8683052 100644 --- a/nreflect/convert.go +++ b/nreflect/convert.go @@ -10,6 +10,37 @@ import ( "strconv" ) +type ConvertFn func(t reflect.Type, value reflect.Value) string + +// StructToStrMap convert struct to string map, json tag +func StructToStrMap(v any, fn ConvertFn) map[string]string { + // 返回 key-value + ret := make(map[string]string) + rType := reflect.TypeOf(v) + rValue := reflect.ValueOf(v) + + rValue = Indirect(rValue) + if rType.Kind() == reflect.Ptr { + rType = rType.Elem() + } + + for i := 0; i < rType.NumField(); i++ { + rField := rType.Field(i) + jsonTag := rField.Tag.Get("json") + if jsonTag == "" || jsonTag == "-" { + continue + } + //rField.Type + if fn == nil { + fn = func(t reflect.Type, value reflect.Value) string { + return String(value) + } + } + ret[jsonTag] = fn(rField.Type, rValue.Field(i)) + } + return ret +} + // BaseTypeVal convert custom type or intX,uintX,floatX to generic base type. // // intX/unitX => int64