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

jmi*_*ite 5 reflection types go go-reflect

有没有办法使用Go 中的反射库从类型名称到其类型表示?

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

icz*_*cza 6

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

运行时

如果类型名称作为string值提供,那么在运行时这是不可能的,因为未显式引用的类型可能无法编译到最终的可执行二进制文件中(因此在运行时显然无法访问,“未知”)。有关详细信息,请参阅 拆分客户端/服务器代码。有关可能的解决方法,请参阅在 Golang 中调用具有特殊前缀或后缀的所有函数

在“编码”时

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

您可以从开始指针的类型,并使用类型化的nil指针值不分配,你可以从它的定位reflect.Type描述符的描述符类型(或元素类型)使用指针的Type.Elem()

这是它的样子:

t := reflect.TypeOf((*YourType)(nil)).Elem()
Run Code Online (Sandbox Code Playgroud)

t上面的类型描述符将与t2下面相同:

var x YourType
t2 := reflect.TypeOf(x)

fmt.Println(t, t2)
fmt.Println(t == t2)
Run Code Online (Sandbox Code Playgroud)

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

main.YourType main.YourType
true
Run Code Online (Sandbox Code Playgroud)