reflect.Type
有没有比在 Go 中获得接口的更好的方法reflect.TypeOf((*someInterface)(nil)).Elem()
?
它有效,但每次滚动过去时都会让我畏缩。
reflect.Type
有没有比在 Go 中获得接口的更好的方法reflect.TypeOf((*someInterface)(nil)).Elem()
?
它有效,但每次滚动过去时都会让我畏缩。
不幸的是,没有。虽然它可能看起来很难看,但它确实表达了获得所需信息所需的最少信息量reflect.Type
。这些通常包含在var()
具有所有此类必要类型的块中的文件顶部,以便在程序初始化时计算它们并且不会在TypeOf
每次函数需要该值时产生查找惩罚。
这个成语在整个标准库中都使用,例如:
html/template/content.go: errorType = reflect.TypeOf((*error)(nil)).Elem()
这种冗长构造的原因源于它reflect.TypeOf
是库的一部分而不是内置的,因此必须实际取值。
在某些语言中,类型的名称是可以用作表达式的标识符。在 Go 中情况并非如此。可以在规范中找到有效的表达式。如果一个类型的名称也可以用作 a reflect.Type
,它会给方法表达式带来歧义,因为reflect.Type
它有自己的方法(实际上,它是一个接口)。它还将语言规范与标准库结合起来,从而降低了两者的灵活性。