golang struct to map

最近写业务,有些很恶心的需求,涉及php,go 的类型转换,由于php是弱类型,因此会涉及入参不定的状况。这里介绍下struct to map 的实现,具体例子参考:php

package main

import (
	"fmt"
	"reflect"
)

type JsonStruct struct {
	AA string `json:"a_a"`
	BB string `json:"b_b"`
}

func Struct2MapName(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[string(t.Field(i).Name)] = v.Field(i).Interface()
	}
	return data
}

func Struct2MapJson(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[string(t.Field(i).Tag.Get("json"))] = v.Field(i).Interface()
	}
	return data
}

func main() {
	obj := JsonStruct{
		AA: "1",
		BB: "2",
	}
	data := Struct2MapName(obj)
	fmt.Printf("data is %v\n", data)
	data1 := Struct2MapName(obj)
	fmt.Printf("data is %v\n", data1)
}

reflect 的type 有name 能够用name 作map key, 也能够使用GetTag 取 json 或者自定义tag 去做为key, 灵活度更大一点,注意这里传参不能是ptr。json

相关文章
相关标签/搜索