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

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(使用前将#替换为@)

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

  • Swift Mirror 反射不返回 UIVIew 上的属性

    尝试使用以下内容获取 UIView 或 UIViewController 的所有属性 func propertysNames gt String var s String for c in Mirror reflecting self ch
  • 使用反射来检查部分方法是否已实现

    背景 我正在使用 Linq to SQL 因此生成了一个包含自动生成的类的 DBML 文件 部分生成过程为某些操作创建部分方法 在我的例子中 我感兴趣的两个方法与表记录的插入和更新相关 这些部分方法是根据 DBML 设计器中创建的每个表生成
  • TypeScript 类型中 bivarianceHack 的目的是什么?

    在阅读 React 的 TypeScript 类型时 我看到了这种模式的一些用法 涉及bivarianceHack 函数声明 types react index d ts https github com DefinitelyTyped D
  • 如何动态计算 C# 表达式?

    我想做相当于 object result Eval 1 3 string now Eval System DateTime Now ToString as string 关注比里斯link http www codeproject com
  • 使用 crypto/ssh 的 golang scp 文件

    我正在尝试通过 ssh 下载远程文件 以下方法在 shell 上运行良好 ssh hostname tar cz opt local folder gt folder tar gz 然而 golang 上的相同方法在输出工件大小方面存在一些
  • 给定方法值,获取接收者对象

    Go 有没有办法从方法值获取接收者对象 例如有没有这样的MagicFunc这将使以下程序输出字符串my info来自底层 Foo 实例 package main import fmt type Foo struct A string fun
  • 共享来自单独命令/进程的属性

    我提供带有多个命令和子命令的命令行工具 我使用cobra https github com spf13 cobra命令行 我有两个单独的命令首先是前提条件e 给其他人 例如第一个命令是通过创建临时文件夹并验证某些文件来首选环境 第二个命令应
  • 类型转换为具有相同属性的另一个

    在我的应用程序的一个部分中 我使用从 xsd 方案生成的类型 我有 2 个版本的架构 2008 和 2009 我使用的类型是 DatumType 在每个方案中 该类型都包含相同的属性 它们是精确的 除了命名空间 有什么方法可以将 Datum
  • 无法通过键获取 Gorilla 会话值

    我无法通过这种方式从会话中获取价值 它是nil session initSession r valWithOutType session Values key 完整代码 package main import fmt github com
  • 如何提高 Field.set 的性能(也许使用 MethodHandles)?

    我正在编写一些调用的代码Field set https docs oracle com en java javase 11 docs api java base java lang reflect Field html set java l
  • 投射回更专业的界面

    我正在用 Go 编写一个游戏 在 C 中 我将所有实体类存储在 BaseEntity 类的数组中 如果一个实体需要在世界中移动 那么它将是一个从 BaseEntity 派生的 PhysEntity 但添加了方法 我尝试模仿这是 go pac
  • 将 python 'type' 对象转换为字符串

    我想知道如何使用 python 的反射功能将 python 类型 对象转换为字符串 例如 我想打印一个对象的类型 print My type is type some object which obviously doesn t work
  • Scala Array.apply 有何魔力

    来自 scala 2 10 4 的 array scala Array定义为 final class Array T length Int extends java io Serializable with java lang Clonea
  • 我可以根据我正在构建的操作系统导入 Golang 包吗?

    假设我有一个基于哪个操作系统的 go 项目 在某些情况下是哪个发行版 我想使用 Systemd 客户端包 Upstart 客户端包 sysv 客户端包 launchd 客户端包 是否可以有选择地导入每个包 以便我只导入我正在构建的每个操作系
  • 是否有任何开源 Java 反射实用程序或 jar?

    是否有任何开源实用程序或 jar 用于处理 java 中的反射 我将方法动态传递给一个类 我想获取返回值 例如 class Department String name Employee employees public void setN
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri
  • 获取类 DisplayName 属性值

    我花了最后一个小时试图获得 a 的价值DisplayName应用于 a 的属性Class 我发现从方法和属性中获取属性值很简单 但我在该类上遇到了困难 有人可以帮我解决这个相对较小的问题吗 示例如下 班上 DisplayName Oppor
  • 使用 OpenTelemetry 统一不同服务的范围

    我刚刚开始使用 OpenTelemetry 并为此创建了两个 微 服务 Standard and GeoMap 最终用户将请求发送到Standard服务 该服务又将请求发送到GeoMap在将结果返回给最终用户之前获取信息 我使用 gRPC
  • TypeScript 中泛型的不安全隐式转换

    TypeScript 编译器tsc编译以下代码 即使使用 strict旗帜 然而 该代码包含一个基本错误 而在 Java 或 C 等语言中可以避免这种错误 interface IBox

随机推荐

  • 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表示 我有一个库 用户需要为某些代码生成提供类型表