有没有办法使用Go中的reflection libraries从类型名称转到Type表示?
我有一个库,用户需要为某些代码生成提供类型表示。我知道它必须是可能的(在某种意义上),因为它们只能创建该类型的变量并调用TypeOf function,但有没有办法绕过这个并从名称中获取表示?
答案 0 :(得分:3)
问题不是很明确,可以用两种方式解释,其中一种答案是否定的,不可能;而另一个答案是肯定的,这是可能的。
如果类型名称是作为string
值提供的,那么在运行时它是不可能的,因为未明确引用的类型可能无法编译到最终的可执行二进制文件中(因此显然变为无法访问,"未知"在运行时)。有关详细信息,请参阅Splitting client/server code。有关可能的解决方法,请参阅Call all functions with special prefix or suffix in Golang。
如果我们正在谈论"编码"时间(源代码编写/生成),然后可以不创建/分配给定类型的变量并调用reflect.TypeOf()
并传递变量。
您可以从指针开始到该类型,并使用类型nil
指针值而无需分配,您可以从其{{3使用Type.Elem()
将描述符转换为指针的 base 类型(或元素类型)的描述符。
这就是它的样子:
t := reflect.TypeOf((*YourType)(nil)).Elem()
上面的类型描述符t
将与下面的t2
相同:
var x YourType
t2 := reflect.TypeOf(x)
fmt.Println(t, t2)
fmt.Println(t == t2)
上述申请的输出(在reflect.Type
上试试):
main.YourType main.YourType
true