程序开发 · 2024年1月25日

如何通过反射从名称获取类型表示?

当前位置: > > > > 如何通过反射从名称获取类型表示?

来源:stackoverflow
2024-04-24 15:24:35
0浏览
收藏

学习知识要善于思考,思考,再思考!今天小编就给大家带来《如何通过反射从名称获取类型表示?》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

有没有办法使用 Go 中的反射库从类型名称转到其类型表示?

我有一个库,用户需要为某些代码生成提供类型表示。我知道这一定是可能的(在某种意义上),因为他们可以创建该类型的变量并调用 TypeOf 函数,但是有没有办法绕过这个并只从名称中获取表示形式?

解决方案

这个问题不太明确,可以用两种方式解释,其中一种答案是否定的,不可能;另一个答案是肯定的,这是可能的。

运行时

如果类型名称作为 string 值提供,那么在运行时这是不可能的,因为未显式引用的类型可能无法编译到最终的可执行二进制文件中(因此显然在运行时变得无法访问,“未知”) 。有关详细信息,请参阅 。有关可能的解决方法,请参阅 。

在“编码”时

如果我们谈论“编码”时间(源代码编写/生成),那么无需创建/分配给定类型的变量并调用 并传递变量也是可能的。

您可以从指向类型的指针开始,并使用类型化的nil指针值而不进行分配,并且您可以从其描述符导航到该类型的描述符使用 type.elem() 的指针的类型(或元素类型)。

它是这样的:

t := reflect.typeof((*yourtype)(nil)).elem()

上面的类型描述符 t 与下面的 t2 相同:

var x yourtype
t2 := reflect.typeof(x)

fmt.println(t, t2)
fmt.println(t == t2)

上述应用程序的输出(在 上尝试一下):

main.YourType main.YourType
true

今天关于《如何通过反射从名称获取类型表示?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注公众号!