有没有办法使用Go 中的反射库从类型的名称到它的类型表示?
我有一个库,用户需要在其中为某些代码生成提供类型表示。我知道这一定是可能的(在某种意义上),因为他们可以创建该类型的变量并调用TypeOf 函数,但是有没有办法绕过这个并从名称中获取表示?
有没有办法使用Go 中的反射库从类型的名称到它的类型表示?
我有一个库,用户需要在其中为某些代码生成提供类型表示。我知道这一定是可能的(在某种意义上),因为他们可以创建该类型的变量并调用TypeOf 函数,但是有没有办法绕过这个并从名称中获取表示?
这个问题不是很明确,可以用两种方式解释,其中一种答案是否定的,不可能;另一个答案是肯定的,这是可能的。
如果类型名称作为一个string
值提供,那么在运行时这是不可能的,因为未明确引用的类型可能不会被编译到最终的可执行二进制文件中(因此在运行时显然变得不可访问,“未知”)。有关详细信息,请参阅 拆分客户端/服务器代码。有关可能的解决方法,请参阅在 Golang 中使用特殊前缀或后缀调用所有函数。
如果我们谈论的是“编码”时间(源代码编写/生成),那么无需创建/分配给定类型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