Go语言 反射(reflect) 常用方法

9 篇文章 0 订阅

type student struct {
Name string `json:“name”`
Score int `json:“age”`
}

stu1 := student{
“小王”,
90,
}

#reflect.TypeOf
t := reflect.TypeOf(stu1) // 返回值 类型 *reflect.rtype 值 student (自定义类型)

t.Name() // 查看自定义类型 student 如果是别名 还是 底层类型
t.Kind() //查看底层类型 struct

##结构体反射
t.NumField() //结构体中的字段数量

###通过下标获取结构体字段信息
field := t.Field(i) //通过下标获取结构体字段信息

field.Name //获取结构体 字段名

field.Index //获取结构体 字段下标

field.Type //获取结构体 类型

field.Tag.Get(“json”) //获取结构体 tag 标签值

###通过字段名获取字段信息
scoreField, ok := t.FieldByName(“Score”) //通过字段名获取字段信息

scoreField.Name //获取结构体 字段名
scoreField.Index //获取结构体 字段下标
scoreField.Type //获取结构体 类型
scoreField.Tag.Get(“json”) //获取结构体 tag 标签值

#reflect.ValueOf

v := reflect.ValueOf(x) // v 值的类型为 reflect.Value 通过 reflect.ValueOf(x) 把 x 变成 反射 圈里的 值
k := v.Kind() //v.Kind() 或取变量 v 的类型 比如 可能是 reflec.Int64 或 reflect.Float64 …

v.Elem().Kind() //变量v 是指针 反射中使用 Elem() 方法获取指针对应值的类型 可能是 reflec.Int64 或 reflect.Float64 …
v.Elem().SetInt(200)//变量v 是指针 反射中使用 Elem() 方法获取指针对应的值

var a *int
v.IsNil(a) //IsNil()常被用于判断指针是否为空

reflect.ValueOf(nil).IsValid() //IsValid()常被用于判定返回值是否有效。

b := struct{}{}
reflect.ValueOf(b).FieldByName(“abc”).IsValid() // 尝试从结构体中查找"abc"字段
reflect.ValueOf(b).MethodByName(“abc”).IsValid() // 尝试从结构体中查找"abc"方法

c := map[string]int{}
reflect.ValueOf©.MapIndex(reflect.ValueOf(“娜扎”)).IsValid() // 尝试从map中查找一个不存在的键
reflect.ValueOf©.MapKeys() //从map中查找所有的键

#对反射的理解
type mysqlConf struct{}
var a mtsqlConf
t :=reflect.TypeOf(*a)
t.Name() // 类型 *mysqlConf
t.Kind() // 在反射reflect中的 类型 Ptr (reflect.Ptr)
t.Elem().Kind() // 指针对应值在 在反射reflect中的 类型 Struct (reflect.Struct)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值