如何通过反射从名称获取类型表示?

2024-02-17

有没有办法使用反射库 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(使用前将#替换为@)

如何通过反射从名称获取类型表示? 的相关文章

随机推荐

  • Docker 服务启动失败

    重启虚拟机后命令docker 图片命令显示错误 Cannot connect to the Docker daemon at unix var run docker sock Is the docker daemon running 看来d
  • 在 SQL Server 2005 中对非常大的结果集进行分页的有效方法是什么?

    EDIT 我仍在等待更多答案 谢谢 在 SQL 2000 时代 我曾经使用临时表方法 使用新的标识列和主键创建临时表 然后选择 A 和 B 之间的标识列 When SQL 2005我来了之后发现了Row Number 从那时起我就一直在使用
  • 如何将API网关与内部ALB集成

    根据https docs aws amazon com apigateway latest developerguide http api develop integrations private html https docs aws a
  • 中止 WebClient.DownloadFileAsync 操作

    安全取消 DownloadFileAsync 操作的最佳方法是什么 我有一个线程 后台工作人员 它启动下载并管理它的其他方面 当我看到该线程有时我结束CancellationPending true 开始下载后 线程将静止并旋转 直到下载完
  • 简单的按键绑定无法按预期工作

    I m trying to bind ctrl x to editor action clipboardCutAction cut but with the condition that it is only invoked when te
  • 如何在ios上正确格式化货币

    我正在寻找一种在不使用 TextField hack 的情况下将字符串格式化为货币的方法 例如 我想将数字 521242 转换为 5 212 42 或者 如果我有一个低于 1 美元的数字 我希望它看起来像这样 52 gt 0 52 Than
  • 用户控件的 BeginUpdate() EndUpdate

    我写了一个用户控制其行为就像容器控制 但完全是由 WindowsForms 绘制的 我继承自UserControl 我想避免在填充控件时绘制控件 因此我需要编写类似于BeginUpdate EndUpdate 当控件是用户绘制的时 这很容易
  • Android:无法添加窗口 - 令牌 null 不适用于应用程序[重复]

    这个问题在这里已经有答案了 可能的重复 Android 1 6 android view WindowManager BadTokenException 无法添加窗口 令牌 null 不适用于应用程序 https stackoverflow
  • 将 MySQL 表恢复到数据库

    我在从命令行将 MySQL 表恢复到数据库时遇到问题 备份表可以使用mysqldump 备份和恢复数据库也可以正常工作 我用过了 mysql uroot p 数据库名 表名 提前致谢 啊 我想我在这里看到了问题 您的备份脚本看起来不错 tb
  • SPServices.SPCascadeDropdowns 未正确级联

    我有三个 SharePoint 2016 列表 组织机构 部门 Groups 组按部门排序 部门按组织排序 每个列表中的标题字段用于组 组织或部门的名称 每个列表中都有一个下拉列表 用于选择相应项目的父级 在我的一个表单中 用户应该选择拥有
  • Google 站点 API,RedirectRequiredException 之后的 IllegalArgumentException(“尝试设置外部 cookie”)

    我正在使用 gdata media 1 0 1 47 1 jar 功能通过 com google gdata client media MediaService getMedia IMediaContent mediaContent 方法获
  • 与 Enterprise Library 4.1 的单声道兼容性

    有人在 mono 中使用最新的企业库 4 1 吗 我使用 Mono 迁移分析器来分析我的 Web 应用程序 并意识到所有企业库 DLL 在 Mono 中都失败了 我需要知道企业库 4 1 与 Mono 2 4 不兼容是真的吗 我有这方面的更
  • C# - 如何解析文本文件(空格分隔的数字)?

    给定一个由空格分隔的数据文件 10 10 10 10 222 331 2 3 3 4 45 4 2 2 4 如何读取该文件并加载到数组中 谢谢 var fileContent File ReadAllText fileName var ar
  • Electron:如何安全地将全局变量注入BrowserWindow / BrowserView?

    我想使用 Electron 加载外部网页BrowserView 它的 API 几乎与BrowserWindow const currentWindow remote getCurrentWindow const view new remot
  • CSS 平铺背景图像的最佳尺寸

    人们经常说 当使用背景图像平铺网页背景时 尺寸较大的图像的性能会更好 因为它需要平铺的频率较低 一段时间以来 我一直将它们设为 8x8 像素 或 8 的倍数 但是是否有人有数据链接来证明在各种浏览器中都是这种情况 考虑渲染时间或页面渲染各个
  • ltrace()如何显示rand()

    当 ltrace 命中 rand 函数时 它会显示 4 个参数 如下所示 兰特 0 0x5649bd4e6010 0x7f0955490760 0x7f09551cf7b0 0x17382962 rand 不接受任何参数 ltrace 这里
  • C/C++向量到Numpy数组的快速转换

    我使用 SWIG 将一些 C 代码粘合到 Python 2 6 并且该粘合的一部分包括一段代码 该代码将大型数据字段 数百万个值 从 C 端转换为 Numpy 数组 我能想到的最好方法是为类实现一个迭代器 然后提供一个 Python 方法
  • Ember.js - 错误 - “断言失败:您必须在传递给‘push’的哈希中包含‘id’”

    通过使用 Express 编写的 REST API 将帖子 标题 文本 保存到 mongodb 数据库并刷新浏览器后 我收到此错误 我已经将主键设置为 id 并且一直在阅读有关可能规范化数据的内容 这是来自服务器的有效负载 数据库中只有 1
  • ESPN Cricinfo 有 API 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Has espncricinfo com http espncricinfo com暴露API 我对实时
  • 如何通过反射从名称获取类型表示?

    有没有办法使用反射库 https golang org pkg reflect 在 Go 中从类型名称转到它的类型Type https golang org pkg reflect Type表示 我有一个库 用户需要为某些代码生成提供类型表