小编典典

Golang反映:从名称获取类型表示形式?

go

有没有一种方法可以使用Go中的反射库将类型的名称转换为类型的表示形式?

我有一个库,用户需要为某些代码生成提供类型表示。我知道这一定是有可能的,因为它们只能创建该类型的变量并调用TypeOf函数,但是有没有一种方法可以避免这种情况并仅从名称中获取表示形式?


阅读 355

收藏
2020-07-02

共1个答案

小编典典

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

在运行时

如果将类型名称作为string值提供,那么在运行时就不可能,因为未明确引用的类型可能无法编译为最终的可执行二进制文件(因此显然在运行时变得不可访问,“未知”)。

在“编码”时间

如果我们正在谈论“编码”时间(编写/生成源代码),那么就可以不创建/分配给定类型的变量,而无需调用reflect.TypeOf()和传递该变量。

您可以从 指向 该类型的 指针 开始,并使用没有分配的
类型化nil_指针值,并且可以使用来从其reflect.Type描述符导航到指针的
_基本
类型(或 元素 类型)的描述符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)

以上应用程序的输出(在Go Playground上尝试):

main.YourType main.YourType
true
2020-07-02