首页 > 编程笔记 > Go语言笔记 阅读:14

golang反射机制简介(新手必看)

Go 程序虽然在编译期间不知晓某些变量的数据类型,但在运行期间支持更新和检查这些变量的值、调用这些变量的函数等操作。在 Go 语言中,这种机制称为反射。

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

如果没有为 bool 类型的变量赋值,该变量的值就是 bool 类型的默认值,即 false。

相关文章