使用反射,我们可以获得给定类型(如uint64、用户自定义结构体等)的类型名称、存储大小和功能。甚至,我们可以修改给定类型的一些字段。golang 是如何实现反射的?我猜有以下几种方式:golang 中的每个类型,包括自定义类型,本身都有类型名称、字段名称和函数名称的信息。Golang 反射只是读取这些信息或调用函数。通过某种机制,Golang 可以获得类型名称、存储大小等信息。而类型本身没有这些信息。我粗略地阅读了golang反射代码。我猜golang使用了第二种方式。谁能描述反射的具体实现?或者推荐我一些文件?阅读所有代码对我来说很困难。
2 回答
ibeautiful
TA贡献1993条经验 获得超5个赞
吃鸡游戏
TA贡献1829条经验 获得超7个赞
这只是一个概述,它可能不是 100% 准确,但希望您会发现它有帮助。
在构建时,Go 链接器会将有关应用程序使用的所有类型的信息嵌入到可执行文件中 ( https://github.com/golang/go/blob/master/src/runtime/symtab.go#L39 )
每个接口值都包含一个指向数据类型描述符的指针(https://github.com/golang/go/blob/master/src/runtime/type.go#L14)
在从编译时已知的类型转换为接口值的过程中,Go 编译器会将这个接口值的类型描述符指向具体的类型描述符(它在编译时已知!)。
例如,当您致电时reflect.TypeOf(uint(87))
:
接口值由引用
uint
类型描述符的编译器创建此接口值
reflect.TypeOf
作为参数传递给函数reflect.TypeOf
函数使用链接器存储在可执行文件中的类型描述符来获取有关 uint 类型的对齐(和其他)信息。
- 2 回答
- 0 关注
- 171 浏览
添加回答
举报
0/150
提交
取消