【问题标题】:How to get Type representation from name via reflection?如何通过反射从名称中获取类型表示?
【发布时间】:2026-02-03 07:05:01
【问题描述】:

有没有办法在 Go 中使用 reflection libraries 将类型名称转换为 Type 表示形式?

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

【问题讨论】:

  • 反射包不包含此功能。如果您正在生成代码,那么go/typesgo/ast 包可能会用到。
  • 没有。使用名称注册表 -> 类型关联进行查找。

标签: go reflection types go-reflect


【解决方案1】:

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

在运行时

如果类型名称作为 string 值提供,那么在运行时这是不可能的,因为未明确引用的类型可能不会编译到最终的可执行二进制文件中(因此显然变得不可访问,“未知”在运行)。详情请参阅Splitting client/server code。有关可能的解决方法,请参阅Call all functions with special prefix or suffix in Golang

在“编码”时

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

您可以从 指针 开始指向该类型,并使用 类型化的 nil 指针值而无需分配,您可以从其 reflect.Type 描述符导航到使用Type.Elem()的指针的base类型(或element类型)的描述符。

看起来是这样的:

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

【讨论】: