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