1. 认识反射
1.1 常见的反射场景
1)编写一个函数,但是并不知道要传的参数类型是什么;也可能是传入的类型很多,这些类型并不能统一表示
2)根据某些条件决定调用哪个函数,比如根据用户的输入来决定。这时就需要对函数和函数的参数进行反射,在运行期间动态地执行函数
1.2 反射可能带来的问题
1)与反射相关的代码,经常是难以阅读的。在软件工程中,代码可读性也是一个非常重要的指标
2)Go 语言作为一门静态语言,编码过程中,编译器能提前发现一些类型错误,但是对于反射代码是无能为力的
3)反射对性能影响还是比较大的,比正常代码运行速度慢一到两个数量级。所以,对于一个项目中处于运行效率关键位置的代码,尽量避免使用反射特性
1.3 反射原理
1.3.1 Go语言的两个特点
1)Go语言是静态类型语言,因此在程序编译阶段,类型已经确定
2)interface{}空接口可以和任意类型进行交互,因此可以利用这一特点实现对任意类型的反射
1.3.2 Go语言的类型
1)变量包含(type,value)两个部分
2)type包括static type和concrete type,简单来说static type是在编码是看见的类型(如int、string),concrete type是runtime系统看见的类型
3)类型断言能否成功,取决于变量的concrete type,而不是static type。因此,一个reader变量如果它的concrete type也实现了write方法的话,它也可以被类型断言为writer
1.4 interface变量
每个interface变量都有一个pair,pair中记录了实际变量的值和类型:
(value, type)
其中:value是实际变量值,type是实际变量类型。一个interface变量包含了2个指针,一个指向值的类型(对应concrete type),一个指向实际的值(对应value)
总结:反射就是用来检测存储在接口变量内部(值value;类型concrete type) pair对的一种机制
2. Type和Value
reflect包提供了两个方法访问接口变量内容,分别是reflect.ValueOf() 和 reflect.TypeOf()
标签:反射,变量,value,concrete,类型,type From: https://www.cnblogs.com/xiaojuzi1024/p/17759813.html