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
ICP备案:
公安联网备案: