使用反射从泛型结构获取类型参数

2024-04-27

想象一下我有以下结构:

type MyGeneric[T string | int] struct {
}

我想在创建新的 MyGeneric 时检查用于实例化该结构的泛型是字符串还是 int。

myGenericString := MyGeneric[string]{}
myGenericString.canHandle("hello") -> should return true
myGenericString.canHandle(8) -> should return false

func (mG MyGeneric[T]) canHandle(value any) bool {
    // how to get what T is the same type as value
}


对于正常值,只需实例化T直接获取其值并reflect.TypeOf()它。但我们可以声明一个[0]T并取其元素类型,因为:

  • [0]T takes 0 memory while T may be as large as T, which would waste a lot of stack and heap 1 if T is something like [4096]int.
  • A raw T不适用于接口类型。reflect.TypeOf()在 nil 接口值(无论是否为空接口)上将返回reflect.Type(nil),后续使用会引起恐慌。
package main

import (
    "fmt"
    "reflect"
)

type MyGeneric[T any] struct {
}

func (mG MyGeneric[T]) canHandle(value any) bool {
    var zero [0]T
    tt := reflect.TypeOf(zero).Elem()
    vt := reflect.TypeOf(value)

    fmt.Printf("-> %v covers %v\n", tt, vt)
    return vt.AssignableTo(tt)
}

type empty struct{}

func main() {
    fmt.Printf("%v\n", MyGeneric[string]{}.canHandle(""))
    fmt.Printf("%v\n", MyGeneric[any]{}.canHandle(""))
    fmt.Printf("%v\n", MyGeneric[string]{}.canHandle(1))
    fmt.Printf("%v\n", MyGeneric[MyGeneric[struct{}]]{}.canHandle(MyGeneric[struct{}]{}))
    fmt.Printf("%v\n", MyGeneric[MyGeneric[struct{}]]{}.canHandle(MyGeneric[empty]{}))
}

Output:

-> string covers string
true
-> interface {} covers string
true
-> string covers int
false
-> main.MyGeneric[struct {}] covers main.MyGeneric[struct {}]
true
-> main.MyGeneric[struct {}] covers main.MyGeneric[main.empty]
false

1 Not sure if it can be optimized out or whether it allocates on heap or stack or both, because it is passed into reflect.TypeOf after upcasting to an interface{}.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用反射从泛型结构获取类型参数 的相关文章

  • 将中间件与 Golang Gorilla mux 子路由器结合使用

    如何将中间件应用到 Go 中大猩猩工具包 http www gorillatoolkit org 多路复用器子路由器 我有以下代码 router mux NewRouter StrictSlash true apiRouter router
  • 在单个 C# 泛型方法中返回可为 null 和 null?

    C 泛型方法是否可以返回对象类型或 Nullable 类型 例如 如果我有一个安全的索引访问器List我想返回一个值 稍后我可以使用以下任一方法检查该值 null or HasValue 目前我有以下两种方法 static T SafeGe
  • 我可以创建一个 List> 吗?

    我正在尝试创建一个列表WeakReference使用 4 5 泛型实现 这样我就可以避免类型检查和转换WeakReference目标 但 WeakReference
  • 返回具有关联类型的特征

    struct A struct PropA struct B struct PropB trait AB type prop fn a self gt fn b self p Self prop gt impl AB for A type
  • 为什么 DER ASN.1 大整数的解组在 Golang 中仅限于 SEQUENCE?

    我希望能够使用encoding asn1 包从 DER 文件中解组一个大整数 但它看起来只适用于整数序列 例如 这不起作用 这很奇怪 因为 Big Int 的编组效果很好 https play golang org p Wkj0jAA6bp
  • 如何对结构切片而不是切片结构进行范围调整

    稍微玩了一下 Go HTML 模板后 我发现的所有循环模板中对象的示例都是将切片结构传递给模板 有点像这个示例 type UserList struct Id int Name string var templates template M
  • 如何通过在切片上查找来从切片复制到数组

    我正在编写一个库来处理二进制格式 我有一个带有数组变量的结构 我想保留它以用于文档目的 我还需要从输入字节片中查找和判断 一些伪代码 type foo struct boo 5 byte coo 3 byte func main input
  • Spring MVC:通用 DAO 和服务类

    我正在 Spring MVC 中编写网页 我使用 Generic DAO 编写了所有 DAO 现在我想重写我的服务类 我该如何写 通用服务 我的 DAO 如下 DAO package net example com dao import j
  • 在运行时计算类代码的哈希值(C#)?

    是否可以在 C 中在运行时计算类的哈希值 大概通过反射 需要明确的是 我不想计算所述类的实例的哈希码 我想计算类代码本身的哈希值 如果类中的函数发生变化 我希望有一个不同的哈希码 计算 理想情况下 这只会对目标代码中的更改敏感 而不仅仅是代
  • 子字符串和 Go 垃圾收集器

    在 Go 中获取字符串的子字符串时 不会分配新的内存 相反 子字符串的底层表示包含一个数据指针 该指针是原始字符串的数据指针的偏移量 这意味着 如果我有一个大字符串并希望跟踪一个小子字符串 则垃圾收集器将无法释放任何大字符串 直到我释放对较
  • Java 反射性能

    使用反射创建对象而不是调用类构造函数是否会导致任何显着的性能差异 是的 一点没错 通过反射查找类是 按幅度 更贵 Quoting Java关于反射的文档 http java sun com docs books tutorial refle
  • Swift 中使用 T 型进行泛型调用

    在我的应用程序中 我想创建一个通用方法 该方法根据给定类型 T 创建一个对象数组 我创建了以下函数 func getArray
  • WinRT 不支持 Assembly.GetCallingAssembly,但适用于可移植类库?

    我需要获取有关调用我的组件的程序集的一些元数据 因此 使用Assembly GetCallingAssembly 似乎是天作之合 但是 我发现它在除 Windows 应用商店之外的任何地方都适用 支持的地方 手机7 0 http msdn
  • 有界通配符相关的编译器错误

    我想知道这段代码有什么问题 Map 但我试图说得更具体 这个问题在这个旧的 Apache 线程 ht
  • Java 泛型:将 Object o 的类与 进行比较

    假设我有以下课程 public class Test
  • 如何在Java中通过反射调用代理(Spring AOP)上的方法?

    一个接口 public interface Manager Object read Long id 实现该接口的类 Transactional Public class ManagerImpl implements Manager Over
  • 结构体到磁盘的高效 Go 序列化

    我的任务是将 C 代码替换为 Go 而且我对 Go API 还很陌生 我正在使用 gob 将数百个键 值条目编码到磁盘页面 但 gob 编码有太多不需要的膨胀 package main import bytes encoding gob f
  • 共享 GOPATH 的良好做法是什么?

    我刚刚开始学习 Go 并阅读现有代码以了解 其他人是如何做的 在这样做时 go 工作空间 的使用 特别是当它与项目的依赖项相关时 似乎无处不在 在处理各种 Go 项目时 使用单个或多个 Go 工作区 即 GOPATH 的定义 的常见最佳实践
  • []interface{}{} 中的双大括号是什么意思

    请注意 这是格式为 的双花括号 而不是嵌套花括号 我也不确定这是空接口问题 切片问题还是结构问题 我猜它至少是其中两个的组合 我正在学习 Golang 并且已经达到了空接口 我发现我需要将空接口声明为 interface 或者例如 inte
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public

随机推荐

  • 如何将输入 type="date" 转换为时间戳?

    我需要转换一个
  • 可以用结构化数据来审查一个人吗?

    我的审查数据围绕people https schema org Person 我想用结构化数据来表示这些评论 像这样的东西 从这里 http moz com ugc getting the most out of schemaorg mic
  • 在 SQL 中合并具有重叠日期范围的记录

    编辑 我们当前的服务器是 SQL 2008 R2 因此 LAG LEAD 功能将不起作用 我正在尝试获取表中的多个数据流并将它们组合成 1 个数据流 鉴于下面的 3 个数据流 我希望最终结果是 1 个优先考虑状态 on 的流 递归似乎是最好
  • 如何使用 YouTube javascript API 获取特定“秒”的 YouTube 视频的缩略图或快照?

    我想拍摄 YouTube 视频的缩略图http www youtube com watch v ffaTjpA1scI http www youtube com watch v ffaTjpA1scI30秒或120秒 我如何使用 youtu
  • SHA 足以检查文件重复吗? (PHP 中的 sha1_file)

    假设您想创建一个文件托管站点 供人们上传文件并向他们的朋友发送链接以供稍后检索 并且您想确保文件在我们存储文件的位置重复 那么 PHP 的 sha1 file 是否足以完成该任务 有什么理由不使用 md5 file 来代替吗 对于前端 它将
  • 即席查询/更新是否开始影响您使用 MongoDB 的工作效率?

    我开发一个 ASP MVC 网站已经快一年了 现在完全在 mongodb 上 我大部分时间都喜欢它 使用 C mongodb 驱动程序和 mongovue 等工具 开发效率非常高 然而 我已经开始达到这样一个地步 有些事情我真的希望我有一个
  • 在 SecureField 的 SwiftUI 中切换 isSecureTextEntry

    我想实现在 SecureField 中显示和隐藏密码的功能 以下是 SecureField 的代码 我添加了按钮 该按钮将被检测到显示和隐藏 SecureField 中的文本 但 swiftUI 没有类似的功能是安全文本条目除了切换之外还有
  • 无法找到模块提供者

    我在使用 PowerShell 时遇到问题 几乎就像没有完全安装一样 这很奇怪 因为它是 Windows 10 并且是附带的 在没有锁定的情况下 我尝试使用另一台正在运行的 Windows 10 计算机上的全新副本替换以下目录 C User
  • 如何使用调查包的 svyby 函数对多个列进行循环?

    我已经尝试了很多方法 但我无法解决问题 我发现here https stackoverflow com questions 13402829 r looping through in survey package here https st
  • 每个命令重置外部差异工具

    我最近安装了一个新的差异工具 差异性的 https github com Wilfred difftastic 这扰乱了我将差异复制到剪贴板 或文件 以发送这些内容的习惯 diff external difft As per https d
  • 无法使用 git 克隆任何存储库

    我尝试克隆一些存储库 但总是遇到相同的错误 我在哪里可以找到有关此错误的更多信息 错误日志文件或类似的文件 或者也许有人知道可能出了什么问题 git clone http github com creationix nvm git nvm
  • Visual Studio 2012 生成后事件 - 错误代码 255

    这是我尝试将应用程序可执行文件复制到另一个文件夹并更改其名称 IF ConfigurationName Release SET DESTINATION ProjectDir Output Distribution IF NOT EXIST
  • 多重绑定多重选择ListView

    好吧 我这里有一个奇怪的 我想要弄清楚的是如何拥有一个由 ObservableCollection 填充的列表视图 根据第一个列表视图的选择更新另一个由另一个 ObservableCollection 填充的 ListView 然后使用 v
  • URLConnection 和 setUseCaches(true)

    我正在使用当前代码在线程中下载图像 Log d TAG Fetching image BASE URL mURL URLConnection connection InputStream input connection new URL B
  • Hstore 和 Rails

    我正在尝试使用最新版本的 activerecord postgres hstore gem 在 Rails 3 2 9 项目中使用 Hstore 但在使用 ActiveRecord 提供的 store accessor 来获取 Hstore
  • 获取浏览器中正在查看的当前页面(可能吗?)

    我想知道 作为一名 Android 开发人员 我是否可以知道浏览器应用程序当前是否打开 如果是 正在查看哪个页面 网址 如果是这样 我将如何去做这件事 如果没有 我也很想知道 所以我不会再搜索了 谢谢 奥姆里 我不知道是否有可能知道浏览器应
  • solr索引嵌套文档

    solr支持嵌套文档吗 有没有更好的方法来实现这种文档
  • Identity Server:在 MVC 客户端的混合流中添加访问令牌的声明

    我已阅读文档并遵循示例 但无法将用户声明放入访问令牌中 我的客户端不是 ASP NET core 因此 MVC 客户端的配置与 v4 示例不同 除非我误解了文档 否则在创建访问令牌时 ApiResources 用于填充配置文件服务中的 Re
  • findbugs-maven-plugin 不执行任何操作

    我不明白 我想在 Maven 3 项目站点中启用 findbugs 报告 并通过将其添加到我的 pom xml 中来实现 如所述here http mojo codehaus org findbugs maven plugin usage
  • 使用反射从泛型结构获取类型参数

    想象一下我有以下结构 type MyGeneric T string int struct 我想在创建新的 MyGeneric 时检查用于实例化该结构的泛型是字符串还是 int myGenericString MyGeneric strin