jmi*_*ite 5 reflection types go go-reflect
我有一个库,用户需要在其中为某些代码生成提供类型表示。我知道这一定是可能的(在某种意义上),因为他们可以创建一个该类型的变量并调用TypeOf 函数,但是有没有办法绕过这个并从名称中获取表示?
这个问题不是很明确,可以用两种方式来解释,其中一种答案是否定的,不可能;另一个答案是肯定的,这是可能的。
如果类型名称作为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)