如何通过反射从名称中获取类型表示?
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
有没有办法使用 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