reflect反射实战

此开源图书由ithaiq原创,创作不易转载请注明出处

  • 定义测试数据

type User struct {
    UserId   int `name:"uid"`
    UserName string
}
  • 通过反射打印字段名和类型

    u := User{}
    t := reflect.TypeOf(u)
    if t.Kind() == reflect.Ptr {
        t = t.Elem() //如果u是指针要这样用
    }
    for i := 0; i < t.NumField(); i++ {
        fmt.Println(t.Field(i).Name, t.Field(i).Type)
    }
  • 通过反射设置字段值

    u := User{}
    t := reflect.ValueOf(u)
    if t.Kind() == reflect.Ptr {
        t = t.Elem() //如果u是指针要这样用
    }
    values := []interface{}{12, "test"}
    for i := 0; i < t.NumField(); i++ {
        fmt.Println(t.Field(i).Interface())
        if t.Field(i).Kind() == reflect.ValueOf(values[i]).Kind() {
            t.Field(i).Set(reflect.ValueOf(values[i]))
        }
    }
  • 案例(map转struct)

func Map2Struct(m map[string]interface{}, u interface{}) {
    v := reflect.ValueOf(u)
    if v.Kind() == reflect.Ptr {
        v = v.Elem()
        if v.Kind() != reflect.Struct {
            panic("must struct")
        }
        findFromMap := func(key string, nameTag string) interface{} {
            for k, v := range m {
                if k == key || k == nameTag {
                    return v
                }
            }
            return nil
        }
        for i := 0; i < v.NumField(); i++ {
            getTagValue := findFromMap(v.Type().Field(i).Name, v.Type().Field(i).Tag.Get("name"))
            if getTagValue != nil && reflect.ValueOf(getTagValue).Kind() == v.Field(i).Kind() {
                v.Field(i).Set(reflect.ValueOf(getTagValue))
            }
        }
    } else {
        panic("must ptr")
    }
}

最后更新于

这有帮助吗?