package main
import (
"fmt"
"reflect"
"github.com/fatih/structs"
)
func main() {
type User struct {
Name string
}
type Server struct {
Name string `json:"name,omitempty"`
ID int
Enabled bool
Users []User `json:"users"`
//http.Server // embedded
}
users := []User{}
users = append(users, User{Name: "你的名字"}, User{Name: "鸣人"})
server := &Server{
Name: "gopher",
ID: 123456,
Enabled: true,
Users: users,
}
fmt.Printf("server:%+v", server)
s := structs.New(server)
//利用第三方库实现
m := s.Map()
fmt.Println("m=", m)
//自定义方法
fmt.Println("StructToMap(server)", StructToMap(server))
}
func StructToMap(item interface{}) map[string]interface{} {
res := map[string]interface{}{}
if item == nil {
return res
}
v := reflect.TypeOf(item)
reflectValue := reflect.ValueOf(item)
reflectValue = reflect.Indirect(reflectValue)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
for i := 0; i < v.NumField(); i++ {
tag := v.Field(i).Tag.Get("json")
field := reflectValue.Field(i).Interface()
if tag != "" && tag != "-" {
if v.Field(i).Type.Kind() == reflect.Struct {
res[tag] = StructToMap(field)
} else {
res[tag] = field
}
}
}
return res
}