网上有种做法是将struct 转json再转回map, 似乎不是很优雅。那我们整个狠活!用反射的方式将复杂的struct转成map就完事了。 为了应对struct中的struct,所以采用递归。
package util
import (
"reflect"
)
func Status2Map(obj any) map[string]any {
t := reflect.TypeOf(obj)
v := reflect.ValueOf(obj)
var result = make(map[string]any)
for i := 0; i < t.NumField(); i++ {
// 过滤私有的,不然会G
if t.Field(i).PkgPath != "" {
continue
}
tag, have := t.Field(i).Tag.Lookup("json")
var realName string
if have {
realName = tag
} else {
realName = t.Field(i).Name
}
switch v.Field(i).Kind() {
case reflect.Struct:
valueValue := v.Field(i).Interface()
result[realName] = Status2Map(valueValue)
default:
result[realName] = v.Field(i).Interface()
}
}
return result
}
注意点:
- 不能导出私有变量,代码中上面的那一行:
t.Field(i).PkgPath - 如果要自定义map的key名,那么在tag后加