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