golang 反射(reflect)

反射是现代程序必备的元素,用于在运行时获取程序元数据,实现动态识别类型及其结构,以及相关的语义信息。
摘要由CSDN通过智能技术生成

golang 反射(reflect)

反射是现代程序必备的元素,用于在 运行时 获取程序元素,如对象等的 元数据,实现动态识别类型及其结构,以及相关的语义信息。

反射在程序中应用非常多,例如:

  • 动态生成数据:json 序列化/反序列化; orm 映射, proxy 透明代理对象
  • 动态调用方法:plugin 实现
  • 框架自动处理程序:annotation tag 注解标签
  • 其他需要数据元数据的应用

在必要的场合,灵活应用反射,是中高级程序员能力的评价标准之一。灵活应用的根本是加深对 go 语言编译与实现的理解,并阅读典型应用案例。

滥用反射,也是低中级程序员最常见的问题,造成程序效率底下、不确定性错误增多。

一、Go 中的反射

go 是静态语言,表示内存中任何一个数据对象(data object)的值及其类型必须是编译期可确定的。因此,go 应用运行时不会像 java 等动态语言一样,在运行期维护所有对象的元数据,以支持多态等需要。也不像 c 语言,不提供任何元数据支持。 但注定 go 语言的反射是简单和有限的。

大神文章,必读!必读!必读!在短短的文章中,说明了 go 语言反射的要点!

请使用 $go tool tour 验证该文中所有代码!!!

这里,仅提示其中要点:

  • 类型与接口

    • Go是静态类型的语言。每个变量都有一种静态类型
    • 有一种重要的类别就是接口类型,它是一组方法的集合
      • 向上类型转换(UpCasting)。编译期完成,如果一个数据对象或接口的方法集合包含要转换的类型的方法集合
      • 空接口 interface{} , 它是任何数据都包含的接口
    • 接口值(内部表示) - 元组(数据对象的值,数据对象的静态类型)
      • 向下类型转换(DownCasting)。 程序通过实现接口断言完成。 接口对象.(断言类型)
      • 接口内部的对总是 (值, 具体类型) 的形式,而不会是 (值, 接口类型) 的形式
  • 反射三法则

    • 1、反射是从接口值到反射对象
      • 变量/数据对象 – 反射 -> 值,具体类型
      • reflect 包中的两种类型: TypeValue
        • reflect.Type 是接口
        • reflect.Value 是结构
      • Type 和 Value 的函数 TypeOf(i interface{}), ValueOf(i interface{})
        • Value 相关的构造函数,Zero,NewAt,MakeSlice...
        • Type 相关的获取函数
      • Kind 方法
        • 值不能离开类型而独立存在, Value.Type() 获取类型
        • Kind 是值和类型的共有方法, Kind 是 go 基础类型的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值