Reflection 获取Go中接口的reflect.Type的更好方法

Reflection 获取Go中接口的reflect.Type的更好方法,reflection,go,Reflection,Go,有没有比reflect.TypeOf((*someInterface)(nil)).Elem()更好的方法来获取Go中接口的reflect.Type 它是有效的,但每次我翻过它时,它都会让我畏缩。不幸的是,没有。虽然它看起来很难看,但它确实表达了获取所需的reflect.Type所需的最少信息量。这些类型通常包含在var()块的文件顶部,包含所有必要的类型,以便在程序初始化时计算它们,并且不会在每次函数需要值时产生TypeOf查找惩罚 此习惯用法在标准库中广泛使用,例如: html/templa

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


它是有效的,但每次我翻过它时,它都会让我畏缩。

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

此习惯用法在标准库中广泛使用,例如:

html/template/content.go: errorType = reflect.TypeOf((*error)(nil)).Elem()
这种冗长构造的原因在于
reflect.TypeOf
是库的一部分,而不是内置的,因此必须实际获取一个值

在某些语言中,类型的名称是可以用作表达式的标识符。围棋并非如此。可以找到有效的表达式。如果一个类型的名称也可用作
reflect.type
,它会给方法表达式带来歧义,因为
reflect.type
有自己的方法(实际上,它是一个接口)。它还将把语言规范与标准库结合起来,这降低了两者的灵活性