2017-07-18 97 views
3

也许我并不完全熟悉仿制药的力量,但空接口interface{}与普通仿真器有什么不同,特别是如果我们有能力使用反射或类型开关?人们总是提到Go没有泛型,但是interface{}看起来好像和Java的<T>这类工作非常相似。空白接口与普通接口有什么不同?

回答

6

如果您来自Java,那么空接口(interface{})实际上更接近于使用Java中的Object变量而不是泛型。

您可以将任何内容分配给interface{}(就像您可以使用Java中的Object变量一样)。

但是,如果您想使用您存储在那里的实际类型(与在Java中使用Object变量相同),则应该“返回”或“键入断言”。

Java中的泛型非常不同,因为它们允许您在编译时进行类型检查。不同之处在于,如果您使用泛型,则无需采用反射或类型切换。

你可以在这里阅读更多关于Java泛型:

https://docs.oracle.com/javase/tutorial/java/generics/

然后按照这一点,接下来的2个或3个步骤转到巡演这里更多的空接口是如何工作的:

https://tour.golang.org/methods/14

+0

那么在Go中,它在运行时检查而不是编译时间的主要区别是什么? – ollien

+1

是的。由于Go没有“泛型”功能,因此可以使用interface {}并进行运行时检查(与Java开发人员在将泛型编译为语言之前一样)。请注意,Go中的集合(切片,地图)是键入的,因此对泛型的需求不是那么重要,因为集合是您需要此功能的最显眼的地方。 – eugenioy

+0

那么,人们还可以通过简单地调用函数来检查接口是否在编译时执行 - 请参阅https://stackoverflow.com/a/44692363/2969090 – Ravi