Java的反射机制是其标志性的特征之一,正是这种语言本身支持的强大的机制使得很多流行的框架有了用武之地。C++中虽然也能实现,但是语言本身并没有提供标准的支持。
而作为一门现代的语言,go语言也引入了反射机制,在这篇文章中我们将会了解一下go语言中的反射机制是如何使用的。
反射机制
反射机制是程序能够检查其自身结构,属于元编程的范畴,强大的同时也往往是困扰的源头。虽然各种语言的反射模型有所不同,但是通过简单的比较也能有所收获。在了解Go的反射机制之前先来看看Java的反射机制吧。
Java的反射机制
我们所熟知的Java的反射机制是什么?对于类和对象的使用,普通的方式是知道类和对象的属性和方法之后进行调用或者访问。
而反射机制,简单来说,是在运行状态中,Java对于任何的类,都能够确认到这个类的所有方法和属性;对于任何一个对象,都能调用它的任意方法和属性。这种动态获取或者调用的方式就是Java的反射机制。
能做什么
在Java中,通过反射机制在运行时能够做到如下:
- 确认对象的类
- 确认类的所有成员变量和方法
- 动态调用任意一个对象的方法
- …
相关基础
在进行更加详细的了解之前,我们需要重新温习一下Go语言相关的一些特性,所谓温故知新,从这些特性中了解其反射机制是如何使用的。
特点 | 说明 |
---|---|
go语言是静态类型语言。 | 编译时类型已经确定,比如对已基本数据类型的再定义后的类型,反射时候需要确认返回的是何种类型。 |
空接口interface{} | go的反射机制是要通过接口来进行的,而类似于Java的Object的空接口可以和任何类型进行交互,因此对基本数据类型等的反射也直接利用了这一特点 |
反射标准库
反射是使用库reflect来实现,使用的时候需要将reflect库import进来
项目 | 详细 |
---|---|
反射标准库 | reflect |
文档 | https://golang.org/pkg/reflect/ |
反射类型 | reflect.Type 和 reflect.Value |
常用函数 | reflect.TypeOf 和 reflect.ValueOf |
reflect.TypeOf 和 reflect.ValueOf的定义如下:
[root@liumiaocn goprj]# go doc reflect.TypeOf
func TypeOf(i interface{}) Type
TypeOf returns the reflection Type that represents the dynamic type of i. If
i is a nil interface value, TypeOf returns nil.
[root@liumiaocn goprj]# go doc reflect.ValueOf
func ValueOf(i interface{}) Value
ValueOf returns a new Value initialized to the concrete value stored in the
interface i. ValueOf(nil) returns the zero Value.
[root@liumiaocn goprj]#
反射定律
go语言