有没有办法使用反射库 https://golang.org/pkg/reflect/在 Go 中从类型名称转到它的类型Type https://golang.org/pkg/reflect/#Type表示?
我有一个库,用户需要为某些代码生成提供类型表示。我知道这一定是可能的(在某种意义上),因为他们可以创建该类型的变量并调用类型函数 https://golang.org/pkg/reflect/#TypeOf,但是有没有办法绕过这个并只从名称中获取表示呢?
这个问题不太明确,可以用两种方式解释,其中一种答案是否定的,不可能;另一个答案是肯定的,这是可能的。
运行时
如果类型名称作为string
值,那么在运行时这是不可能的,因为未显式引用的类型可能无法编译到最终的可执行二进制文件中(因此显然在运行时变得无法访问,“未知”)。详情请参阅拆分客户端/服务器代码 https://stackoverflow.com/questions/38875016/splitting-client-server-code/38875901#38875901。有关可能的解决方法,请参阅调用Golang中所有具有特殊前缀或后缀的函数 https://stackoverflow.com/questions/37384473/call-all-functions-with-special-prefix-or-suffix-in-golang/37384665#37384665.
在“编码”时
如果我们谈论“编码”时间(源代码编写/生成),那么无需创建/分配给定类型的变量并调用reflect.TypeOf() https://golang.org/pkg/reflect/#TypeOf并传递变量。
您可以从pointer类型,并使用typed nil
无需分配的指针值,您可以从其导航reflect.Type https://golang.org/pkg/reflect/#Type描述符到描述符base类型(或element类型)的指针使用Type.Elem()
.
它是这样的:
t := reflect.TypeOf((*YourType)(nil)).Elem()
类型描述符t
上面将等同于t2
below:
var x YourType
t2 := reflect.TypeOf(x)
fmt.Println(t, t2)
fmt.Println(t == t2)
上述应用程序的输出(在去游乐场 https://play.golang.org/p/W_6MMkxoAS):
main.YourType main.YourType
true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)