猿问

golang是如何实现反射的?

使用反射,我们可以获得给定类型(如uint64、用户自定义结构体等)的类型名称、存储大小和功能。甚至,我们可以修改给定类型的一些字段。golang 是如何实现反射的?我猜有以下几种方式:

  1. golang 中的每个类型,包括自定义类型,本身都有类型名称、字段名称和函数名称的信息。Golang 反射只是读取这些信息或调用函数。

  2. 通过某种机制,Golang 可以获得类型名称、存储大小等信息。而类型本身没有这些信息。

我粗略地阅读了golang反射代码。我猜golang使用了第二种方式。谁能描述反射的具体实现?或者推荐我一些文件?阅读所有代码对我来说很困难。


慕标5832272
浏览 172回答 2
2回答

ibeautiful

接口的描述在这里有很好的描述:反射定律。接口类型的变量存储一对:分配给变量的具体值和该值的类型描述符。基本上,类型是从您的代码中静态知道的。更灵活的接口类型保留原始底层类型以返回原始数据类型。

吃鸡游戏

这只是一个概述,它可能不是 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 类型的对齐(和其他)信息。
随时随地看视频慕课网APP

相关分类

Go
我要回答