struct转map
使用json模块
json.Marshal
参考代码:
func JSONMethod(content interface{}) map[string]interface{} {
var name map[string]interface{}
if marshalContent, err := json.Marshal(content); err != nil {
fmt.Println(err)
} else {
d := json.NewDecoder(bytes.NewReader(marshalContent))
d.UseNumber() // 设置将float64转为一个number
if err := d.Decode(&name); err != nil {
fmt.Println(err)
} else {
for k, v := range name {
name[k] = v
}
}
}
return name
}
使用reflect模块
通过reflect模块来获取结构体的key值和value值,然后直接进行组装。这种方法不能识别结构体中的tag,所以无法兼容首字母小写,而其他字母存在大写的情况.
参考代码:
func ReflectMethod(obj interface{}) map[string]interface{} {
t := reflect.TypeOf(obj)
v := reflect.ValueOf(obj)
var data = make(map[string]interface{})
for i := 0; i < t.NumField(); i++ {
data[strings.ToLower(t.Field(i).Name)] = v.Field(i).Interface()
}
return data
}
使用第三方库
github.com/fatih/structs
测试
type Human struct {
Name string `json:"name"`
Age int `json:"age"`
Profile string `structs:"profile"`
IsGopher bool `json:"isGopher"`
}
func main() {
human := Human{"Detector", 18, "A tester", true}
fmt.Println("Json method:", JSONMethod(human))
fmt.Println("========")
fmt.Println("Reflect method:", ReflectMethod(human))
fmt.Println("========")
fmt.Println("Third lb:", structs.Map(human))
}
输出如下:
总结
structs
- reflect.Field
- json
- structs