Go的反射
基本介绍
- 反射可以在运行时动态获取变量的各种信息,比如变量的类型(type),类别(kind)
- 如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段、方法)
- 通过反射,可以修改变量的值,可以调用关联的方法
- 使用反射,需要import“reflect”
反射的相关函数和转换
- reflect.TypeOf(变量名):获取变量的类型,返回reflect.Type类型
- reflect.ValueOf(变量名):获取变量的值,返回reflect.Value类型
- 变量、interface{}和reflect.Value是可以相互转换的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tvtcOmUv-1622206019072)(C:\Users\51936\AppData\Roaming\Typora\typora-user-images\image-20210405150845983.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udxlmPTC-1622206019073)(C:\Users\51936\AppData\Roaming\Typora\typora-user-images\image-20210405150934923.png)]
案例
package main
import (
"reflect"
"fmt"
)
//专门演示反射
func reflectTest01(b interface{}) {
//通过反射获取的传入的变量的 type , kind, 值
//1. 先获取到 reflect.Type
rTyp := reflect.TypeOf(b)
fmt.Println("rType=", rTyp)
//2. 获取到 reflect.Value
rVal := reflect.ValueOf(b)
n2 := 2 + rVal.Int()
//n3 := rVal.Float()
fmt.Println("n2=", n2)
//fmt.Println("n3=", n3)
fmt.Printf("rVal=%v rVal type=%T\n", rVal, rVal)
//下面我们将 rVal 转成 interface{}
iV := rVal.Interface()
//将 interface{} 通过断言转成需要的类型
num2 := iV.(int)
fmt.Println("num2=", num2)
}
//专门演示反射[对结构体的反射]
func reflectTest02(b interface{}) {
//通过反射获取的传入的变量的 type , kind, 值
//1. 先获取到 reflect.Type
rTyp := reflect.TypeOf(b)
fmt.Println("rType=", rTyp)
//2. 获取到 reflect.Value
rVal := reflect.ValueOf(b)
//3. 获取 变量对应的Kind
//(1) rVal.Kind() ==>
kind1 := rVal.Kind()
//(2) rTyp.Kind() ==>
kind2 := rTyp.Kind()
fmt.Printf("kind =%v kind=%v\n", kind1, kind2)
//下面我们将 rVal 转成 interface{}
iV := rVal.Interface()
fmt.Printf("iv=%v iv type=%T \n", iV, iV)
//将 interface{} 通过断言转成需要的类型
stu, ok := iV.(Student)
if ok {
fmt.Printf("stu.Name=%v\n", stu.Name)
}
}
type Student struct {
Name string
Age int
}
type Monster struct {
Name string
Age int
}
func main() {
//请编写一个案例,
//演示对(基本数据类型、interface{}、reflect.Value)进行反射的基本操作
//1. 先定义一个int
var num int = 100
reflectTest01(num)
//2. 定义一个Student的实例
stu := Student{
Name : "tom",
Age : 20,
}
reflectTest02(stu)
}
反射的注意事项和细节
-
reflect.Value.Kind获取变量的类别,返回的是一个常量
-
Type是类型,Kind是类别,Type和Kind可能相同也可能不同
-
使用反射的方式来获取变量的值(并返回对应的类型),要求数据类型匹配
意事项和细节 -
reflect.Value.Kind获取变量的类别,返回的是一个常量
-
Type是类型,Kind是类别,Type和Kind可能相同也可能不同
-
使用反射的方式来获取变量的值(并返回对应的类型),要求数据类型匹配
-
通过反射来修改变量,注意当使用SetXXX的方法来设置需要通过对应的指针类型来完成,这样才能改变传入的变量的值,同时需要使用到reflect.Value.Elem()