- 基本介绍
* 反射可以在运行时动态获取遍历的各种信息,比如变量的类型(type),类别(kind)
* 如果是结构体变量,还可以获取到结构体本身的信息,(包括结构体的字段,方法)
* 通过反射,可以修改变量的值,可以调用关联的方法
* 使用反射,需要import("reflect")
- 反射常见应用场景又以下两种
* 不知道接口调用那个函数,根据传入参数在运行时确定调用的具体接口,这种需要对函数或方法反射,例如以下这种桥接模式,比如
func bridge(funcPtr interface{},args ...interface{})
* 第一个参数funcPtr以接口形式传入函数指针,函数参数args以可变参数的形式传入,bridge函数中可以用反射来动态执行funPtr函数
* 对结构体序列化时,如果结构体有指定的Tag,也会使用到反射生成对应的字符串
- 反射重要的函数和概念
* reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type 类型
* reflect.ValueOf(变量名),获取变量的值。返回reflect.Value时一个结构体类型。通过reflect.Value 可以获取到关于该变量的很多信息
* 变量,interface{} 和 reflect.Value 是可以相互转换的,在实际开发中,会经常使用到
----------------案例----------------
var studuentStu
var num int
//专门用于做反射
func test (b interface{}){
// 1. 如何将interface{} 转成 reflect.value
rVal:=reflect.ValueOf(b)
// 2. 如何将reflect.Value -> interface{}
iVal:=rVal.Interface()
// 3. 如何将interface{} 转成原来的变量类型,使用类型断言
v:=iVal.(Stu)
}
--------------------------------
更多介绍细说golang反射与案例练习查看下面的连接,如果觉得有用,帮忙点个star吧
有疑问加站长微信联系(非本文作者)