一、结构体转map[string]interface{}的类型问题
package main
import (
"encoding/json"
"fmt"
)
//定义一个结构体
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
user := User{
Name: "小王",
Age: 25,
}
m, _ := json.Marshal(&user)
var ma map[string]interface{}
json.Unmarshal(m,&ma)
for s, i := range ma {
fmt.Printf("s=%v i=%v i的type:%T\n",s,i,i)
}
}
解决方法:
package main
import (
"fmt"
"reflect"
)
//定义一个结构体
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func ToMap(in interface{},tagName string)(map[string]interface{},error) {
myMap := make(map[string]interface{})
v := reflect.ValueOf(in)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
if v.Kind() != reflect.Struct {
return nil,fmt.Errorf("类型错误",v)
}
t := v.Type()
//遍历结构体字段
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
get := field.Tag.Get(tagName)
if get != "" {
myMap[get] = v.Field(i).Interface()
}
}
return myMap,nil
}
func main() {
user := User{
Name: "小王",
Age: 25,
}
toMap, _ := ToMap(&user, "json")
for s, i := range toMap {
fmt.Printf("s=%v i=%v i的type:%T\n",s,i,i)
}
}