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

How to get Type representation from name via reflection?

有没有办法使用 reflection libraries in Go to go from the name of a type to its Type 表示?

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

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

运行时

如果类型名称作为 string 值提供,那么在运行时这是不可能的,因为未明确引用的类型可能不会编译到最终的可执行二进制文件中(因此显然变得无法访问, "unknown" 在运行时)。有关详细信息,请参阅 Splitting client/server code. For possible workarounds see

在"coding"时间

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

您可以从 指针 开始指向类型,并使用 typed nil 指针值而不分配,并且您可以使用 [=17] 从其 reflect.Type 描述符导航到指针的 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