为什么没有在Go的generics?

免责声明:我现在只玩了一天,所以很有可能我错失了很多。

有谁知道为什么没有真正的支持generics/模板/ whats inAName在Go? 所以有一个通用map ,但这是由编译器提供的,而Go程序员不能编写自己的实现。 所有关于使Go尽可能正交的讨论,为什么我可以使用generics而不是创build一个新的?

特别是当涉及到函数式编程时,有lambda函数,甚至闭包,但是对于一个缺乏generics的静态types系统,我该如何编写像filter(predicate, list)这样的通用高阶函数呢? 好的,链接列表等可以用牺牲types安全性来完成。

对于SO / Google的快速search没有透露任何见解,它看起来像generics,如果有的话,将被添加到Go作为事后的想法。 我确实相信汤普森比爪哇人做得更好,但是为什么要把generics放在一边呢? 还是他们计划,只是没有实施?

这个答案你可以在这里find: http : //golang.org/doc/faq#generics

为什么Go不具有genericstypes?

generics可能会在某个时候添加。 尽pipe我们了解一些程序员的工作,但我们并不觉得紧迫。

generics非常方便,但是在types系统和运行时复杂的代价。 我们还没有find一种能够使价值与复杂性成正比的devise,尽pipe我们仍在继续思考。 同时,Go的内置地图和切片,以及使用空接口构build容器(显式拆箱)的能力意味着在许多情况下可以编写代码,如果不那么stream畅,则可以使用generics将要启用的代码。

这仍然是一个公开的问题。

“退伍老兵之一Russ Cox写了一篇题为”通用困境“的博客文章 ,他问道

…你想慢程序员,慢编译器和臃肿的二进制文件,或者慢执行时间?

速度慢的程序员是没有generics的结果,慢的编译器是由类似generics的C ++引起的,执行速度慢的原因是Java使用的装箱 – 拆箱方法。

在博客中没有提到的第四种可能性是去C#路线。 生成类似于C ++的专用代码,但在运行时需要它。 我真的很喜欢它,但是Go非常不同于C#,所以这可能根本不适用于…

我应该提及的是,使用stream行的Java 1.4类似于generics编程的技术, 在 interface{}遭受与装箱拆箱(因为这就是我们正在做的)完全相同的问题,除了编译时types安全性的损失之外。 对于小types(如整数),请优化interface{}types,以便转换为接口{}的整数列表占用连续的内存区域,并且只占正常整数的两倍。 尽pipe如此,在从interface{}转换时仍然存在运行时检查的开销。 参考 。

所有添加通用支持的项目(其中有几个都是有趣的)统一使用编译时代码生成的C ++路由。

尽pipegenerics不是当前内置的,但是generics的外部实现有几个需要注意的地方,它们使用注释来结合生成代码的小型实用程序。

这是一个这样的实现: http : //clipperhouse.github.io/gen/