有没有一种方法可以使用Go中的反射库将类型的名称转换为类型的表示形式?
我有一个库,用户需要为某些代码生成提供类型表示。我知道这一定是有可能的,因为它们只能创建该类型的变量并调用TypeOf函数,但是有没有一种方法可以避免这种情况并仅从名称中获取表示形式?
这个问题不是很明确,可以用两种方式解释,一种是不可能的,另一种是不可能的。另一个答案是肯定的,这是可能的。
如果将类型名称作为string值提供,那么在运行时就不可能,因为未明确引用的类型可能无法编译为最终的可执行二进制文件(因此显然在运行时变得不可访问,“未知”)。
string
如果我们正在谈论“编码”时间(编写/生成源代码),那么就可以不创建/分配给定类型的变量,而无需调用reflect.TypeOf()和传递该变量。
reflect.TypeOf()
您可以从 指向 该类型的 指针 开始,并使用没有分配的 类型化nil_指针值,并且可以使用来从其reflect.Type描述符导航到指针的 _基本 类型(或 元素 类型)的描述符Type.Elem()。
nil
reflect.Type
Type.Elem()
它是这样的:
t := reflect.TypeOf((*YourType)(nil)).Elem()
t上面的类型描述符与t2下面的相同:
t
t2
var x YourType t2 := reflect.TypeOf(x) fmt.Println(t, t2) fmt.Println(t == t2)
以上应用程序的输出(在Go Playground上尝试):
main.YourType main.YourType true