天天看点

(四十五)golang--反射

反射基本介绍:

(1)反射可以在运行时动态获取变量的各种信息,比如变量的类型、类别;

(2)如果是结构体变量,还可以获取结构体本身的信息(包括结构体字段、方法);

(3)通过反射,可以修改变量的值,可以调用关联的方法;

(4)使用反射,需要Import "reflect:"

变量--空接口--relect.Value之间的转换关系:

(四十五)golang--反射

int变量与反射变量之间的转换:

(四十五)golang--反射

 结构体变量与反射变量之间的转换:

(四十五)golang--反射

反射注意事项和使用细节:

(1)reflect.Vale.Kind,获取变量的类别,返回的是一个常量;

(四十五)golang--反射

(2)Type是类型,Kind是类别,Type和Kind可能是相同的,也可能是不同的;

比如:var num int=10的type是Int,Kind也是int

     var stu Student, stu的rype是pkg1.Student,Kind是struct

(3)通过反射介意让变量在interface{}和reflect.Value之间相互转换;

(4)使用反射的方式来获取变量的值,要求数据类型匹配;

(5)通过反射来修改变量,注意当使用SetXxx方法来设置需要通过对指针类型来完成,这样才能改变传入变量的值,同时需要使用到reflect.Value.Elem()方法;即rVal.Elem().SetInt(20)

具体实践;

使用反射来遍历结构体的字段,并调用结构体的方法,并获取结构体标签的值。

要在反射中修改结构体的字段的值,必须传入的是地址,并且在反射中使用.Elem().SetXxx()

(四十五)golang--反射

具体实践2:通过反射完成适配器

运行结果:

(四十五)golang--反射

具体实践3:通过反射操作任意结构体类型

(四十五)golang--反射