- 基本介绍

    * 反射可以在运行时动态获取遍历的各种信息,比如变量的类型(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吧

反射理论与操作案例


code
64 声望2 粉丝

生命的意义并不刻意在什么地方停留