当前位置: 首页 > 面试题库 >

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

周昊乾
2023-03-14
问题内容

有没有一种方法可以使用Go中的反射库将类型的名称转换为类型的表示形式?

我有一个库,用户需要为某些代码生成提供类型表示。我知道这一定是有可能的,因为它们只能创建该类型的变量并调用TypeOf函数,但是有没有一种方法可以避免这种情况并仅从名称中获取表示形式?


问题答案:

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

在运行时

如果将类型名称作为string值提供,那么在运行时就不可能,因为未明确引用的类型可能无法编译为最终的可执行二进制文件(因此显然在运行时变得不可访问,“未知”)。

在“编码”时间

如果我们正在谈论“编码”时间(编写/生成源代码),那么就可以不创建/分配给定类型的变量,而无需调用reflect.TypeOf()和传递该变量。

您可以从 指向 该类型的 指针 开始,并使用没有分配的
类型化nil_指针值,并且可以使用来从其reflect.Type描述符导航到指针的
_基本
类型(或 元素 类型)的描述符Type.Elem()

它是这样的:

t := reflect.TypeOf((*YourType)(nil)).Elem()

t上面的类型描述符与t2下面的相同:

var x YourType
t2 := reflect.TypeOf(x)

fmt.Println(t, t2)
fmt.Println(t == t2)

以上应用程序的输出(在Go Playground上尝试):

main.YourType main.YourType
true


 类似资料:
  • 问题内容: 在我的Android应用程序,我需要和从当我得到执行命令后的结果。我怎样才能做到这一点? 问题答案: 就这么简单(是您的对象,应该在数据库中将其设置为正确的表名):

  • 问题内容: 假设我定义了以下类型: 我将如何以编程方式将类型作为字符串获取,因此以后可能很容易重构,而不是: 我不太喜欢,因为它实例化了它,也可以从Interface实例化。 问题答案: 您可以使用包装(包装也可以在内部使用)。您可以从 指向 该类型的 指针 开始,并使用没有分配的 类型化_指针值,并且可以使用来从其描述符导航到指针的 _基本 类型(或 元素 类型)的描述符。 例: 输出(在Go

  • 问题内容: 是否有一个JavaScript的等效的Java的? 问题答案: 是否有与Java等效的JavaScript ? 没有 。 名称为。不论类别如何,的类别名称均为。ES2015环境中的内置构造函数具有正确的属性;例如是。 但是,这里有各种各样的骇客,它们都以一种或另一种方式下降: 这是一种可以满足您需要的技巧-请注意,它会修改Object的原型,而人们对此并不满意(通常是出于充分的理由)

  • 问题内容: 是否可以实例化t1的reflect.Type? 是否可以通过将名称“ t1”作为字符串来获取t1的reflect.Type? 问题答案: 在1,是的,有点: 无需实例化。但是,Go没有类型文字,这是我想您要的。要获取类型的运行时值,您需要具有某种值。如果您不希望或无法在运行时创建该值,则可以从类型为nil的值中提取它。如果您不喜欢每次都查找的想法,可以将此运行时类型存储在变量中。 在2

  • 问题内容: 范例: 我想从引用变量中获取接口名称。有没有办法做到这一点? 问题答案: 使用反射,您可以调用返回您的类实现的方法。 为了得到名字

  • 我的数据库里有两个表叫做 编号列表和编号状态 我目前正在使用下面的查询获得完美的结果 现在我要number_list的名字。两个表都有编号是通用的。我已经尝试了一些左连接等,但我正在学习MySQL,所以没有得到适当的结果。如果有人能帮我做这件事,请告诉我。谢啦