有没有比 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/