反射基本介绍:
(1)反射可以在运行时动态获取变量的各种信息,比如变量的类型、类别;
(2)如果是结构体变量,还可以获取结构体本身的信息(包括结构体字段、方法);
(3)通过反射,可以修改变量的值,可以调用关联的方法;
(4)使用反射,需要Import "reflect:"
变量--空接口--relect.Value之间的转换关系:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iYlVmY1IWY3MjZyYjZ3ADNwYzYwI2N2cTOlBjNzYmM28CX3AzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL4M3Lc9CX6MHc0RHaiojIsJye.png)
int变量与反射变量之间的转换:
结构体变量与反射变量之间的转换:
反射注意事项和使用细节:
(1)reflect.Vale.Kind,获取变量的类别,返回的是一个常量;
(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()
具体实践2:通过反射完成适配器
运行结果:
具体实践3:通过反射操作任意结构体类型