gpt4 book ai didi

reflection - golang是如何实现反射的?

转载 作者:IT王子 更新时间:2023-10-29 01:14:32 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

这只是一个概览,可能不是 100% 准确,但希望对您有所帮助。

在构建时,Go 链接器会将有关应用程序使用的所有类型的信息嵌入到可执行文件中 (https://github.com/golang/go/blob/master/src/runtime/symtab.go#L39)

每个接口(interface)值都包含一个指向数据类型描述符(https://github.com/golang/go/blob/master/src/runtime/type.go#L14)的指针

在从编译时已知的类型转换为接口(interface)值的过程中,Go 编译器会将此接口(interface)值的类型描述符指向具体的类型描述符(它在编译时已知!)。

例如当你调用 reflect.TypeOf(uint(87)) 时:

  • 接口(interface)值由引用uint类型描述符的编译器创建
  • 此接口(interface)值作为参数传递给 reflect.TypeOf 函数
  • reflect.TypeOf 函数使用链接器存储在可执行文件中的类型描述符来获取有关 uint 类型的对齐(和其他)信息。

关于reflection - golang是如何实现反射的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34605415/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com