Golang之反射

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

在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。

引用

基本方法

reflect包里定义了一个接口和一个结构体,即 reflect.Type 和 reflect.Value,它们提供很多函数来获取存储在接口里的类型信息。
reflect.Type 主要提供关于类型相关的信息,所以它和 _type 关联比较紧密;
reflect.Value 则结合 _type 和 data 两者,因此程序员可以获取甚至改变类型的值。
reflect 包中提供了两个基础的关于反射的函数来获取上述的接口和结构体:

// 提取一个接口中值的类型信息
func TypeOf(i interface{}) Type
// 返回interface{}里存储的实际变量
func ValueOf(i interface{}) Value

反射三大定律

Reflection goes from interface value to reflection object.
Reflection goes from reflection object to interface value.
To modify a reflection object, the value must be settable.

  1. 反射可以将“接口类型变量”转换为“反射类型对象”。
  2. 反射可以将“反射类型对象”转换为“接口类型变量”。
  3. 如果要修改“反射类型对象”,其值必须是“可写的”(settable)。

反射性能

通过reflect,我们可以实现获取对象类型、对象字段、对象方法的能力,获取struct的tag信息,动态创建对象,对象是否实现特定的接口,对象的转换、对象值的获取和设置、Select分支动态调用等功能, 看起来功能不错,但是大家也都知道一点: 使用reflect是有性能代价的!


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

本文来自:简书

感谢作者:网管同学

查看原文:Golang之反射

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

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