135 votes

Pourquoi pas de génériques dans Go?

Avertissement: je n'ai joué qu'à Aller pour un jour, donc il ya une bonne chance que j'ai raté beaucoup de choses.

Quelqu'un sait pourquoi il n'y a pas de réel soutien pour les génériques/templates/whatsInAName en Aller? Il y a donc un générique map, mais qui est fournie par le compilateur, alors qu'un Aller programmeur ne peut pas écrire sa propre mise en œuvre. Avec tous les discours sur la faisant Aller orthogonale possible, pourquoi ne puis-je UTILISER un type générique, mais pas en CRÉER un nouveau?

Surtout quand il s'agit de la programmation fonctionnelle, il y a des lambdas, même les fermetures, mais avec un système de type statique manque de médicaments génériques, comment puis-je écrire, eh bien, générique des fonctions d'ordre supérieur, comme filter(predicate, list)? OK, les listes chaînées et similaire peut être fait avec interface{} sacrifier la sécurité.

Une recherche rapide sur SO / Google n'a pas révélé d'idées, il ressemble génériques, le cas échéant, seront ajoutés à l'Aller comme une réflexion après coup. Je fais confiance Thompson à faire bien mieux que le Java les gars, mais pourquoi garder les génériques? Ou sont-ils prévus et tout simplement pas encore mise en œuvre?

84voto

Vinzenz Points 1949

cette réponse que vous trouverez ici: http://golang.org/doc/faq#generics

Pourquoi n'Allez pas avoir les types génériques?

Les génériques peuvent ainsi être ajouté à un certain point. Nous ne nous sentons pas une urgence pour eux, même si nous comprenons que certains programmeurs faire.

Les génériques sont pratiques, mais ils ont un coût en termes de complexité dans le système de type et le moment de l'exécution. Nous n'avons pas encore trouvé un dessin qui donne de la valeur proportionnelle à la complexité, même si nous continuons à penser. En attendant, Go intégré dans les cartes et les tranches, en plus de la capacité à utiliser l'interface vide pour construire des conteneurs (explicite unboxing) signifie dans de nombreux cas, il est possible d'écrire du code qui fait ce que les génériques permettrait, si moins de douceur.

Cette question reste ouverte.

38voto

user7610 Points 820

Russ Cox, l'un des vétérans a écrit un billet de blog intitulé Générique Dilemme, dans lequel il demande à

...voulez-vous de ralentir les programmeurs, lent, des compilateurs et des ballonnements binaires, ou de ralentissement du temps d'exécution?

Lent programmeurs étant le résultat de pas de génériques, lent compilateurs sont causés par le C++ comme génériques et de ralentissement du temps d'exécution de la tige à partir de la boxe-unboxing approche que Java utilise.

La quatrième possibilité est pas mentionné dans le blog va le C# route. Générer le code spécialisé comme en C++, mais au moment de l'exécution lorsqu'il est nécessaire. Je l'aime vraiment, mais Aller est très à la différence de C# et donc ce n'est probablement pas applicable à tous les...

Je dois mentionner que l'utilisation de la populaire Java 1.4 comme technique de programmation générique en aller , qui projette d' interface{} souffre exactement les mêmes problèmes que la boxe-unboxing (parce que c'est ce que nous faisons), en plus de la perte de temps de compilation de sécurité de type. Pour les petits types (comme ints) Aller optimise l' interface{} , de façon à ce qu'une liste d'entiers qui ont été exprimées à l'interface{} occupe un espace contigu de mémoire et ne prend que deux fois plus d'espace que la normale ints. Il y a encore les frais généraux de l'exécution des contrôles lors de la coulée d' interface{}, cependant. De référence.

Tous les projets d'ajouter le support générique aller (il y en a plusieurs d'entre eux et que tous sont intéressants), uniformément aller le C++ route de la compilation génération de code.

10voto

Alexander Points 1851

Bien que les génériques ne soient pas intégrés, il existe plusieurs implémentations externes de génériques à la volée, qui utilisent des commentaires combinés à de petits utilitaires qui génèrent du code.

Voici une telle implémentation: http://clipperhouse.github.io/gen/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X