Avertissement: je ne joue avec Go que depuis un jour, il y a donc de fortes chances que j'en ai manqué beaucoup.
Est-ce que quelqu'un sait pourquoi il n'y a pas vraiment de support pour les génériques/modèles/whatsInAName dans Go? Il existe donc un map
générique, mais fourni par le compilateur, tandis qu'un programmeur Go ne peut pas écrire sa propre implémentation. Avec toutes les discussions sur la façon de rendre Go aussi orthogonal que possible, pourquoi puis-je UTILISER un type générique mais pas en créer un nouveau?
Surtout quand il s'agit de programmation fonctionnelle, il y a des lambdas, même des fermetures, mais avec un système de type statique dépourvu de génériques, comment puis-je écrire, enfin, des fonctions génériques d'ordre supérieur comme filter(predicate, list)
? OK, les listes liées et autres peuvent être effectuées avec interface{}
sacrifier la sécurité du type.
En effectuant une recherche rapide sur SO/Google n'a pas révélé d'informations, il semble que les génériques, le cas échéant, seront ajoutés à Go après coup. Je fais confiance à Thompson pour faire bien mieux que les Java les gars, mais pourquoi garder les génériques à l’écart? Ou sont-ils prévus et tout simplement pas encore implémentés?
vous trouverez cette réponse ici: http://golang.org/doc/faq#generics
Pourquoi Go n'a-t-il pas de types génériques?
Les génériques pourraient bien être ajoutés à un moment donné. Nous ne ressentons pas d'urgence pour eux, même si nous comprenons que certains programmeurs le ressentent.
Les génériques sont pratiques mais ils ont un coût en complexité dans le système de type et le temps d'exécution. Nous n'avons pas encore trouvé de design qui donne une valeur proportionnée à la complexité, même si nous continuons d'y penser. Pendant ce temps, les cartes et les tranches intégrées de Go, ainsi que la possibilité d'utiliser l'interface vide pour construire des conteneurs (avec unboxing explicite) signifient que dans de nombreux cas, il est possible d'écrire du code qui fait ce que les génériques permettraient, si moins facilement.
Cela reste un problème ouvert.
Il existe un projet de conception pour les génériques à https://blog.golang.org/go2draft .
Russ Cox, l'un des vétérans de Go a écrit un article de blog intitulé The Generic Dilemma , dans lequel il demande
… Voulez-vous des programmeurs lents, des compilateurs lents et des binaires gonflés, ou des temps d'exécution lents?
Les programmeurs lents étant le résultat de l'absence de génériques, les compilateurs lents sont causés par des génériques de type C++ et les temps d'exécution lents découlent de l'approche boxing-unboxing utilisée par Java Java.
La quatrième possibilité non mentionnée dans le blog est la voie C #. Génération du code spécialisé comme en C++, mais au moment de l'exécution lorsque cela est nécessaire. J'aime vraiment ça, mais Go est très différent de C # donc ce n'est probablement pas du tout applicable ...
Je dois mentionner que l'utilisation de la populaire Java 1.4 comme technique de programmation générique en cours qui transforme en interface{}
souffre exactement des mêmes problèmes que la boxe-unboxing (parce que c'est ce que nous faisons), en plus de la perte de sécurité du type de temps de compilation. Pour les petits types (comme les pouces), Go optimise le interface{}
saisissez de sorte qu'une liste d'entiers qui ont été convertis en interface {} occupe une zone de mémoire contiguë et ne prend que deux fois plus d'espace que les entiers normaux. Il y a encore des frais généraux de vérifications d'exécution lors de la conversion à partir de interface{}
, bien que. Référence .
Tous les projets qui ajoutent un support générique à parcourir (il y en a plusieurs et tous sont intéressants) suivent uniformément la route C++ de compilation de génération de code temporel.
Même si les génériques ne sont pas actuellement intégrés, il existe plusieurs implémentations externes de génériques pour go, qui utilisent des commentaires en combinaison avec de petits utilitaires qui génèrent du code.
Voici une telle implémentation: http://clipperhouse.github.io/gen/