Golang反映:从名称中获取类型表示?

时间:2016-11-30 03:28:31

标签: go reflection types go-reflect

有没有办法使用Go中的reflection libraries从类型名称转到Type表示?

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

1 个答案:

答案 0 :(得分:3)

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

在运行时

如果类型名称是作为string值提供的,那么在运行时它是不可能的,因为未明确引用的类型可能无法编译到最终的可执行二进制文件中(因此显然变为无法访问,"未知"在运行时)。有关详细信息,请参阅Splitting client/server code。有关可能的解决方法,请参阅Call all functions with special prefix or suffix in Golang

At"编码"时间

如果我们正在谈论"编码"时间(源代码编写/生成),然后可以不创建/分配给定类型的变量并调用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