Golang之反射

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

引用

  • 提高 golang 的反射性能
  • Golang 反射性能优化
  • Go 语言反射三定律
  • Go Reflect 性能
  • 图解go反射实现原理

基本方法

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之反射)