概述
反射是指在程序运行期对程序本身进行访问和修改的能力。包reflect实现了运行时反射,允许程序操作具有任意类型的对象。典型的用法是取一个具有静态类型interface{}的值,通过调用TypeOf来提取其动态类型信息,TypeOf返回一个Type。
类型和种类
Type包括基本类型和用户定义的类型,类型名不同类型不同。Kind包括固定的类型种类
Map、Slice、Chan 属于引用类型,使用起来类似于指针,但是在种类常量定义中仍然属于独立的种类,不属于 Ptr。type A struct{} 定义的结构体属于 Struct 种类,*A 属于 Ptr。
Type和Value
- reflect.Valueof(变量名)返回变量对应的reflect.Value类型
- reflect.Typeof(变量名)返回变量对应的reflect.Type类型
Value类型包含值操作,Type类型包含类型操作
反射的缺点
- 基于反射的代码是极其脆弱的,反射中的类型错误会在真正运行的时候才会引发pic,那很可能是在代码写完的很长时间之后。
- 大量使用反射的代码通常难以理解。
- 反射的性能低下,基于反射实现的代码通常比正常代码运行速度慢一到两个数量级。