基本概念

对所有接口进行反射,都可以得到一个包含Type和Value的信息结构。Type主要表达的是被反射的这个变量本身的类型信息,而Value则为该变量实例本身的信息。

基本用法

获取类型信息
Go 反射 - 图1
以上代码将输出如下的结果:
Go 反射 - 图2

Type和Value都包含了大量的方法,其中第一个有用的方法应该是Kind,这个方法返回该类型的具体信息:Uint、Float64等。Value类型还包含了一系列类型方法,比如Int(),用于返回对应的值。查看以下示例:
Go 反射 - 图3
Go 反射 - 图4
结果为:
Go 反射 - 图5

获取值类型
类型Type中有一个成员函数CanSet(),其返回值为bool类型。如果CanSet()返回false,表示你不应该调用Set()和SetXxx()方法,否则会收到这样的错误信息:
Go 反射 - 图6
注意区分以下代码:

片段1:
Go 反射 - 图7
片段2:
Go 反射 - 图8

对结构体的反射操作

Go 反射 - 图9

以上例子的输出为:
Go 反射 - 图10

可以看出,对于结构的反射操作并没有根本上的不同,只是用了Field()方法来按索引获取对应的成员。当然,在试图修改成员的值时,也需要注意可赋值属性。


Go 反射 - 图11