也许我并不完全了解泛型的强大功能,但是interface{}
如果我们能够使用反射或类型切换,那么空接口与通用接口有何不同?人们总是提到Go没有泛型,但interface{}
似乎它的工作与<T>
Java中的相似.
eug*_*ioy 10
如果你来自Java,那么空接口(interface{}
)实际上更接近于使用Object
Java中的变量而不是使用泛型.
您可以为其分配任何内容interface{}
(就像您可以使用Object
Java中的变量一样).
但是如果你想使用你存储在那里的实际类型,你应该"强制转换"或"输入断言"(与Object
Java中的变量相同).
Java中的泛型是完全不同的,因为它们允许您在编译时保持类型检查.不同的是,如果您使用泛型,则不需要求助于反射或类型开关.
您可以在此处阅读有关Java泛型的更多信息:
https://docs.oracle.com/javase/tutorial/java/generics/
然后按照这个以及Go巡演的下两个或3个步骤,了解有关空接口如何工作的更多信息:
https://tour.golang.org/methods/14
考虑到泛型的要点是在提供编写类型无关函数/方法的工具时维护静态类型语言的编译时类型安全检查,具有运行时类型断言/开关的空接口与泛型完全不同,我想说就编程范式而言,它几乎与泛型完全相反。
我想说,过去十年中超过一半的编程语言改进都是为了避免运行时错误,我想这就是为什么 Go 有一些“内置泛型”,如切片和映射,而不是旧 JavaScript 的数组之类的东西。仅在运行时对其元素进行类型检查。因此,Go 中带有类型断言/切换的空接口绝对不能替代泛型,就我个人而言,我会尽量避免使用空接口。