为了账号安全,请及时绑定邮箱和手机立即绑定

golang是如何实现反射的?

golang是如何实现反射的?

Go
慕标5832272 2021-12-06 19:10:35
使用反射,我们可以获得给定类型(如uint64、用户自定义结构体等)的类型名称、存储大小和功能。甚至,我们可以修改给定类型的一些字段。golang 是如何实现反射的?我猜有以下几种方式:golang 中的每个类型,包括自定义类型,本身都有类型名称、字段名称和函数名称的信息。Golang 反射只是读取这些信息或调用函数。通过某种机制,Golang 可以获得类型名称、存储大小等信息。而类型本身没有这些信息。我粗略地阅读了golang反射代码。我猜golang使用了第二种方式。谁能描述反射的具体实现?或者推荐我一些文件?阅读所有代码对我来说很困难。
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

接口的描述在这里有很好的描述:反射定律

接口类型的变量存储一对:分配给变量的具体值和该值的类型描述符。

基本上,类型是从您的代码中静态知道的。更灵活的接口类型保留原始底层类型以返回原始数据类型。


查看完整回答
反对 回复 2021-12-06
?
吃鸡游戏

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 类型的对齐(和其他)信息。


查看完整回答
反对 回复 2021-12-06
  • 2 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信