包reflect用于实现运行时反射(run-time reflect),其允许一个程序操作任何类型的object。典型的用法就是获取一个interface{}类型调用reflect.TypeOf(),从而获得该抽象类型的实际的表示Type。
对于某一个变量调用ValueOf()会返回Value,其代表着运行时的数据值。
1. Type类型的抽象
Type用于表示Go的类型的抽象。但是值得指出的是,并不是go中的所有类型都支持Type接口中定义的所有方法。对于Type接口中方法,假如某些类型不支持,我们会在介绍该方法时对其进行相应的说明。
通常对于一个go的类型,我们首先会调用Kind()方法以找出其切确的类型,然后再会针对该切确类型调用相应的方法来使用。
对于Type中的Kind()方法,其返回如下类型中的一种:
1.1 rtype的实现
前面我们看到reflect中有Type
抽象接口,其是用于提供接口给外部用户使用的。在refelect包的内部,其有rtype
来表示一个类型
:
之后是针对某一些具体类型,例如array类型,chan类型需要为其提供特定的内部表示。
1.2 Method的抽象
2. Value的抽象
对于go中的一个变量,我们可以用Value来对其进行抽象。值得注意的是,对于任意一个go类型的变量,其可能并不是支持Value的全部方法。
通过上面的定义我们可以看到,对于golang中的一个变量,其抽象后的Value类型其实是对变量的一个封装:
[参看]: