空接口与通用接口有何不同?

oll*_*ien 9 generics go

也许我并不完全了解泛型的强大功能,但是interface{}如果我们能够使用反射或类型切换,那么空接口与通用接口有何不同?人们总是提到Go没有泛型,但interface{}似乎它的工作与<T>Java中的相似.

eug*_*ioy 10

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

您可以为其分配任何内容interface{}(就像您可以使用ObjectJava中的变量一样).

但是如果你想使用你存储在那里的实际类型,你应该"强制转换"或"输入断言"(与ObjectJava中的变量相同).

Java中的泛型是完全不同的,因为它们允许您在编译时保持类型检查.不同的是,如果您使用泛型,则不需要求助于反射或类型开关.

您可以在此处阅读有关Java泛型的更多信息:

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

然后按照这个以及Go巡演的下两个或3个步骤,了解有关空接口如何工作的更多信息:

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

  • 是.由于Go没有'泛型'功能,您可以使用interface {}并进行运行时检查(与Java开发人员在Generics之前使用的语言相同).请注意,Go(切片,贴图)中的集合是打字的,因此对于泛型的需求在某种程度上并不那么重要,因为集合是您需要此功能的最突出的位置. (3认同)
  • 那么Go中的主要区别在于它是在运行时检查而不是编译时间吗? (2认同)
  • 该示例不适用于interface {}变量,而是使用类型变量.您可以在编译时检查类型是否实现了接口,在编译时无法检查接口{}是否属于给定类型. (2认同)

hel*_*ach 7

考虑到泛型的要点是在提供编写类型无关函数/方法的工具时维护静态类型语言的编译时类型安全检查,具有运行时类型断言/开关的空接口与泛型完全不同,我想说就编程范式而言,它几乎与泛型完全相反。

我想说,过去十年中超过一半的编程语言改进都是为了避免运行时错误,我想这就是为什么 Go 有一些“内置泛型”,如切片和映射,而不是旧 JavaScript 的数组之类的东西。仅在运行时对其元素进行类型检查。因此,Go 中带有类型断言/切换的空接口绝对不能替代泛型,就我个人而言,我会尽量避免使用空接口。