reflection - 在 Go 中获取接口(interface)的 reflect.Type 的更好方法

标签 reflection go

有没有比 reflect.TypeOf((*someInterface)(nil)).Elem() 更好的方法来获取 Go 中接口(interface)的 reflect.Type

它有效,但每次滚动经过它时都会让我感到畏缩。

最佳答案

不幸的是,没有。虽然它可能看起来很丑陋,但它确实表达了获取您需要的 reflect.Type 所需的最少信息量。这些通常包含在文件顶部的 var() block 中,具有所有这些必要的类型,以便它们在程序初始化时计算并且不会产生 TypeOf每次函数需要值时查找惩罚。

这个习语在整个标准库中使用,例如:

html/template/content.go: errorType = reflect.TypeOf((*error)(nil)).Elem()

这种冗长结构的原因在于 reflect.TypeOf 是库的一部分而不是内置的,因此必须实际取值。

在某些语言中,类型的名称是可以用作表达式的标识符。 Go 中不是这种情况。可以找到有效的表达式 in the spec .如果类型的名称也可用作 reflect.Type,它会为方法表达式引入歧义,因为 reflect.Type 有自己的方法(事实上,它是一个接口(interface))。它还会将语言规范与标准库结合起来,从而降低两者的灵 active 。

关于reflection - 在 Go 中获取接口(interface)的 reflect.Type 的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14169867/

相关文章:

c# - 通过继承判断两个 MethodInfo 实例是否代表同一个(非虚)方法

java - 加载事先不知道包的 Java 类

regex - 从字符串中提取信息

oracle - 如何将图像作为 BLOB 插入 Oracle 数据库

algorithm - 附加字符串和数组的类似 Go 函数未按预期运行

php - golang,revel,如何解析 post json?

c# - 动态编译代码时出现IOException

java - 如何在运行时使用 LambdaMetafactory 访问动态类中的非静态方法

scala - 列出所有可见的隐式

go - 如何制作一个只允许整数的接口(interface)?