反射reflect

Go语言提供了一种机制,能够在运行时更新、检查变量值,调用方法,而不需要在编译时就知道这些变量具体类型。这种机制被称为反射。

Go语言官方API提供的反射机制:一是fmt包提供的字符串格式功能,另一个是针对特定协议的编解码功能。尽管Go中很多包内部都是用反射技术实现的,

但由于反射是一个复杂技术,不推荐初学者随意使用,因此,很多API都没有公开反射相关的接口。

Go语言的reflect包实现了运行时反射,允许程序操作任意类型的对象。典型用法是用静态类型interface{}保存一个值,通过调用TypeOf获取其动态类型信息,该函数返回一个Type类型值。调用ValueOf函数返回一个Value类型值,该值代表运行时的数据。

应用的场景

前面我们学过了结构体的序列化和反序列化。在创建结构体时,可以在struct 的定义语法中添加一个tag标签,使用这个tag标签可以在序列化时,指定的字段的名称。这里面使用的到的tag标签的底层实现,就用到了“反射”机制。
另外,在go的框架开发过程中,也常常会用到反射机制。通过反射来编写一个“适配器函数”(也叫桥连接)。可以使这个函数在程序运行期间,根据实际需要动态的调用不同接口的函数,实现相应的功能。

本文章首发在 LearnKu.com 网站上。