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

时间:2013-01-05 07:57:33

标签: reflection go

是否有更好的方法让Go中的reflect.Type接口获得reflect.TypeOf((*someInterface)(nil)).Elem()

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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