Generics 空接口与泛型接口有何不同?

Generics 空接口与泛型接口有何不同?,generics,go,Generics,Go,也许我并不完全了解泛型的功能,但是空接口,接口{}与泛型有什么不同,特别是如果我们能够使用反射或类型开关的话?人们总是提到Go没有泛型,但是interface{}看起来它的工作与Java中的类似 如果您来自Java,空接口(interface{})实际上更接近于使用Java中的Object变量,而不是泛型 可以将任何内容分配给接口{}(就像Java中的对象变量一样) 但是如果您想使用存储在那里的实际类型(与Java中的Objectvariables相同),那么您应该将“cast”或“type a

也许我并不完全了解泛型的功能,但是空接口,
接口{}
与泛型有什么不同,特别是如果我们能够使用反射或类型开关的话?人们总是提到Go没有泛型,但是
interface{}
看起来它的工作与Java中的
类似

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

可以将任何内容分配给
接口{}
(就像Java中的
对象
变量一样)

但是如果您想使用存储在那里的实际类型(与Java中的
Object
variables相同),那么您应该将“cast”或“type assert”返回

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

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

然后按照此步骤和Go tour接下来的2或3个步骤进行操作,了解有关空界面工作原理的更多信息:


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


我要说的是,在过去十年中,编程语言的改进有一半以上是为了避免运行时错误,我想这就是为什么Go有一些“内置泛型”,比如slice和map,而不是像旧JavaScript的数组一样,在运行时只对元素进行类型检查。因此,Go中带有类型断言/开关的空接口绝对不能替代泛型,我个人会尽量避免使用空接口。

Go中的主要区别是在运行时检查而不是在编译时检查?是的。由于Go没有“泛型”特性,您可以使用接口{}并进行运行时检查(与Java开发人员在泛型将其转换为语言之前所做的相同)。请注意,Go中的集合(切片、映射)是类型化的,因此对泛型的需求在某种程度上并不那么关键,因为集合是您需要此功能的最突出的地方。您还可以通过简单调用函数来检查接口是否在编译时实现-请参阅该示例不使用接口{}变量,而不是类型化变量。您可以在编译时检查类型是否实现了接口,但无法在编译时检查接口{}是否属于给定类型。更不用说Go了,类型断言允许您查看和使用底层类型。对于泛型,你基本上是放弃了了解你的类型。添加到你的优秀答案中。Golang现在为泛型编程的类型参数提供实验支持。看见