golang reflect 初识01

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