第 15 行,Type 是 cat 的一个成员,这个成员类型后面带有一个以```开始和结尾的字符串。这个字符串在 Go语言中被称为 Tag(标签)。一般用于给字段添加自定义信息,方便其他模块根据信息进行不同功能的处理。
第 19 行,创建 cat 实例,并对两个字段赋值。结构体标签属于类型信息,无须且不能赋值。
第 22 行,获取实例的反射类型对象。
第 25 行,使用 reflect.Type 类型的 NumField() 方法获得一个结构体类型共有多少个字段。如果类型不是结构体,将会触发宕机错误。
第 28 行,reflect.Type 中的 Field() 方法和 NumField 一般都是配对使用,用来实现结构体成员的遍历操作。
第 31 行,使用 reflect.Type 的 Field() 方法返回的结构不再是 reflect.Type 而是StructField 结构体。
第 35 行,使用 reflect.Type 的 FieldByName() 根据字段名查找结构体字段信息,cat Type 表示返回的结构体字段信息,类型为 StructField,ok 表示是否找到结构体字段的信息。
第 38 行中,使用 StructField 中 Tag 的 Get() 方法,根据 Tag 中的名字进行信息获取。
通过反射获取值信息反射不仅可以获取值的类型信息,还可以动态地获取或者设置变量的值。Go语言中使用 reflect.Value 获取和设置变量的值。
变量、interface{}和reflect.Value是可以相互转换的。这点在实际开发中,会经常碰到。
使用反射值对象包装任意值Go 语言中,使用 reflect.ValueOf() 函数获得值的反射值对象(reflect.Value)。书写格式如下:
rValue := reflect.ValueOf(rawValue)reflect.ValueOf 返回 reflect.Value 类型,包含有 rawValue 的值信息。reflect.Value 与原值间可以通过值包装和值获取互相转化。reflect.Value 是一些反射操作的重要类型,如反射调用函数。
从反射值对象获取被包装的值Go 语言中可以通过 reflect.Value 重新获得原始值。
从反射值对象(reflect.Value)中获取值得方法可以通过下面几种方法从反射值对象 reflect.Value 中获取原值,如下表所示。
反射值获取原始值的方法 方法名说 明Interface() interface{} 将值以 interface{} 类型返回,可以通过类型断言转换为指定类型
Int() int64 将值以 int 类型返回,所有有符号整型均可以此方式返回
Uint() uint64 将值以 uint 类型返回,所有无符号整型均可以此方式返回
Float() float64 将值以双精度(float64)类型返回,所有浮点数(float32、float64)均可以此方式返回
Bool() bool 将值以 bool 类型返回
Bytes() []bytes 将值以字节数组 []bytes 类型返回
String() string 将值以字符串类型返回
从反射值对象(reflect.Value)中获取值得例子
下面代码中,将整型变量中的值使用 reflect.Value 获取反射值对象(reflect.Value)。再通过 reflect.Value 的 Interface() 方法获得 interface{} 类型的原值,通过 int 类型对应的 reflect.Value 的 Int() 方法获得整型值。
package main import ( "fmt" "reflect" ) func main() { //声明整型变量a并赋初值 var a int = 1024 //获取变量a的反射值对象 valueOfA := reflect.ValueOf(a) //获取interface{}类型的值,通过类型断言转换 var getA int = valueOfA.Interface().(int) //获取64位的值,强制类型转换为int类型 var getB int = int(valueOfA.Int()) fmt.Println(getA, getB) }代码输出如下:
1024 1024代码说明如下:
第 11 行,声明一个变量,类型为 int,设置初值为 1024。
第 14 行,获取变量 a 的反射值对象,类型为 reflect.Value,这个过程和 reflect.TypeOf() 类似。
第 17 行,将 valueOfA 反射值对象以 interface{} 类型取出,通过类型断言转换为 int 类型并赋值给 getA。
第 20 行,将 valueOfA 反射值对象通过 Int 方法,以 int64 类型取出,通过强制类型转换,转换为原本的 int 类型。
通过反射访问结构体成员的值