Golang 优雅地将struct 转 map

539 阅读1分钟

网上有种做法是将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
}

注意点:

  1. 不能导出私有变量,代码中上面的那一行:t.Field(i).PkgPath
  2. 如果要自定义map的key名,那么在tag后加