1、利用反射获取结构体的字段和tag
type A struct {
Id int64 `json:"id" orm:"Id"`
Name string `json:"name" orm:"Name"`
AppointmentStatus string `json:"appointment_status" orm:"Status"`
}
func main() {
a := "6"
log.Println(reflect.ValueOf(a))
log.Println(reflect.TypeOf(a))
b := A{
Id: 6,
Name: "dongdong",
AppointmentStatus: "通过",
}
c := &A{
Id: 7,
Name: "xx",
AppointmentStatus: "111",
}
log.Println(reflect.ValueOf(b))
log.Println(reflect.TypeOf(b).Kind())
log.Println(reflect.TypeOf(c).Kind())
rt := reflect.TypeOf(b)
for i := 0; i < reflect.TypeOf(b).NumField(); i++ {
log.Println(rt.Field(i).Name, rt.Field(i).Type, rt.Field(i).Tag)
}
}
// SetFieldInfo 根据反射获取实体的信息
func SetFieldInfo(entity interface{}) map[string]string {
rt := reflect.TypeOf(entity)
if rt.Kind().String() == "ptr" {
rt = rt.Elem()
}
if rt.Kind().String() != "struct" {
return nil
}
infoMap := make(map[string]string)
for i := 0; i < rt.NumField(); i++ {
jsonTag := rt.Field(i).Tag.Get("json")
ormTag := rt.Field(i).Tag.Get("orm")
if jsonTag == "" {
continue
}
if ormTag == "" {
infoMap[jsonTag] = rt.Field(i).Name
} else {
infoMap[jsonTag] = ormTag
}
}
return infoMap
}
reflect
中根据reflect.TypeOf
可以得到元数据信息
rt.Kind()
获取类型信息
rt.Elem()
取地址指针
for i := 0; i < reflect.TypeOf(b).NumField(); i++ {
log.Println(rt.Field(i).Name, rt.Field(i).Type, rt.Field(i).Tag)
}
rt.Field(i).Name
获取字段名
rt.Field(i).Tag
获取字段Tag