细说反射&reflect

code · · 711 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

- 基本介绍

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

反射理论与操作案例


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:code

查看原文:细说反射&reflect

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

711 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传