golang反射机制简介(新手必看)
Go 程序虽然在编译期间不知晓某些变量的数据类型,但在运行期间支持更新和检查这些变量的值、调用这些变量的函数等操作。在 Go 语言中,这种机制称为反射。
Go 语言的 reflect 包可以用于访问和修改反射对象的信息。在 reflect 包中,有两种基本反射类型,即 *reflect.rtype(表示变量类型的反射类型)和 reflect.Value(表示变量值的反射类型)。reflect 包中的 reflect.TypeOf() 和 reflect.ValueOf() 函数用于获取变量类型和变量值的反射类型。
Go 语言把 reflect.TypeOf() 和 reflect.ValueOf() 两个函数返回的对象称作反射对象。
通过一个例子演示 reflect.TypeOf() 函数的使用方法。
【实例】打印变量类型的反射类型。定义值为 7 的 int 类型变量 i,声明 bool 类型变量 b,定义值为 11 的 float64 类型变量 f,使用 reflect.TypeOf() 函数分别打印变量 i、b 和 f 的类型及其反射类型。代码如下:
下例演示reflect.ValueOf()函数的使用方法。
【实例】打印变量值的反射类型。定义值为 7 的 int 类型变量 i,声明 bool 类型变量 b,定义值为 11 的 float64 类型变量 f,使用 reflect.ValueOf() 函数分别打印变量 i、b 和 f 的值及其反射类型。代码如下:
Go 语言的 reflect 包可以用于访问和修改反射对象的信息。在 reflect 包中,有两种基本反射类型,即 *reflect.rtype(表示变量类型的反射类型)和 reflect.Value(表示变量值的反射类型)。reflect 包中的 reflect.TypeOf() 和 reflect.ValueOf() 函数用于获取变量类型和变量值的反射类型。
Go 语言把 reflect.TypeOf() 和 reflect.ValueOf() 两个函数返回的对象称作反射对象。
Go语言reflect.TypeOf()函数
reflect.TypeOf() 函数的操作对象既可以是接口变量,也可以是非接口变量。对某个变量使用 reflect.TypeOf() 函数,就能够获取这个变量类型的反射类型。通过一个例子演示 reflect.TypeOf() 函数的使用方法。
【实例】打印变量类型的反射类型。定义值为 7 的 int 类型变量 i,声明 bool 类型变量 b,定义值为 11 的 float64 类型变量 f,使用 reflect.TypeOf() 函数分别打印变量 i、b 和 f 的类型及其反射类型。代码如下:
package main import ( "fmt" "reflect" ) func main() { // 定义 int 类型变量 i var i int = 7 // 获取变量 i 的类型的反射类型 typeI := reflect.TypeOf(i) // 打印变量 i 的类型及其反射类型 fmt.Printf("变量 i 的类型:%v,变量 i 的类型的反射类型:%T\n", typeI, typeI) // 声明 bool 类型变量 b var b bool // 获取变量 b 的类型的反射类型 typeB := reflect.TypeOf(b) // 打印变量 b 的类型及其反射类型 fmt.Printf("变量 b 的类型:%v,变量 b 的类型的反射类型:%T\n", typeB, typeB) // 定义 float64 类型变量 f var f float64 = 11 // 获取变量 f 的类型的反射类型 typeF := reflect.TypeOf(f) // 打印变量 f 的类型及其反射类型 fmt.Printf("变量 f 的类型:%v,变量 f 的类型的反射类型:%T\n", typeF, typeF) }运行结果如下:
变量i的类型:int,变量i的类型的反射类型:*reflect.rtype 变量b的类型:bool,变量b的类型的反射类型:*reflect.rtype 变量f的类型:float64,变量f的类型的反射类型:*reflect.rtype
Go语言reflect.ValueOf()函数
reflect.ValueOf() 函数用于获取变量值的反射类型。这个变量既可以是接口变量,也可以是非接口变量。下例演示reflect.ValueOf()函数的使用方法。
【实例】打印变量值的反射类型。定义值为 7 的 int 类型变量 i,声明 bool 类型变量 b,定义值为 11 的 float64 类型变量 f,使用 reflect.ValueOf() 函数分别打印变量 i、b 和 f 的值及其反射类型。代码如下:
package main import ( "fmt" "reflect" ) func main() { // 定义 int 型变量 i var i int = 7 // 获取变量 i 的值的反射类型 valueI := reflect.ValueOf(i) // 打印变量 i 的值及其反射类型 fmt.Printf("变量 i 的值:%v,变量 i 的值的反射类型:%T\n", valueI, valueI) // 声明 bool 类型变量 b var b bool // 获取变量 b 的值的反射类型 valueB := reflect.ValueOf(b) // 打印变量 b 的值及其反射类型 fmt.Printf("变量 b 的值:%v,变量 b 的值的反射类型:%T\n", valueB, valueB) // 定义 float64 类型变量 f var f float64 = 11 // 获取变量 f 的值的反射类型 valueF := reflect.ValueOf(f) // 打印变量 f 的值及其反射类型 fmt.Printf("变量 f 的值:%v,变量 f 的值的反射类型:%T\n", valueF, valueF) }运行结果如下:
变量i的值:7,变量i的值的反射类型:reflect.Value
变量b的值:false,变量b的值的反射类型:reflect.Value
变量f的值:11,变量f的值的反射类型:reflect.Value