La demande d’ajout des génériques dans le langage Go de Google, réclamés de longue date par de nombreux utilisateurs pour simplifier son usage, devrait bientôt aboutir. En effet, une proposition de changement, déposée le 12 janvier dans GitHub, demande l’ajout du support des paramètres de type pour les types et les fonctions, afin d’introduire dans le langage une forme de programmation générique. Cela fait plusieurs années que l’ajout du support des génériques au langage est souhaité par les utilisateurs, c’est même l'une des fonctionnalités les plus demandées depuis la première version du langage Go, sortie en 2009. Aujourd'hui, les développeurs de Go pense qu’une implémentation pourrait être incluse dans les versions bêta de Go 1.18 d'ici la fin de cette année. L'implémentation serait complète mais peut-être pas totalement optimisée.
Les génériques peuvent fournir de puissants blocs de construction pour partager le code et construire plus facilement des programmes. La programmation générique permet de représenter des structures et des fonctions de données sous une forme générique sans qu’il soit nécessaire de spécifier les types en premier lieu. Par exemple, un développeur pourrait écrire une fonction opérationnelle sur une portion de type de données arbitraire, et ne spécifier le type de données réel que lorsque la fonction est appelée. Un développeur pourrait également définir une structure de données qui stocke des valeurs de n'importe quel type, dans laquelle le type réel à stocker est spécifié au moment où instance de la structure de données est créée.
Plusieurs changements nécessaires
La proposition de programmation générique de Go implique plusieurs changements, notamment :
- Les fonctions peuvent avoir une liste de paramètres de type supplémentaire utilisant des crochets, mais elle ressemblera à une liste de paramètres ordinaire : func F[T any](p T) { ... }
- Ces paramètres de type peuvent être utilisés par les paramètres réguliers et dans le corps de la fonction.
- Les types peuvent également avoir une liste de paramètres de type : type MySlice[T any] []T
- Chaque paramètre de type a un type de contrainte, exactement comme chaque paramètre ordinaire a un type : func F[T Constraint](p T) { ... }
- Les contraintes de type sont des types d'interface.
- La nouvelle dénomination prédéclarée any est une contrainte de type qui autorise n'importe quel type.
- Les types d'interface utilisés comme contraintes de type peuvent avoir une liste de types prédéclarés ; seuls les arguments de type qui correspondent à l'un de ces types satisfont la contrainte.
- Les fonctions génériques ne peuvent utiliser que les opérations autorisées par leurs contraintes de type.
- L'utilisation d'une fonction ou d'un type générique nécessite de passer des arguments de type.
- L'inférence de type permet d'omettre les arguments de type d'un appel de fonction dans les cas courants.
Adapter les génériques à un langage comme Go est une tâche difficile, comme en témoignent les tentatives infructueuses menées en 2010. Ces dernières années, les développeurs de Go ont travaillé sur une série de projets de conception qui ont abouti à un design basé sur des paramètres de type. Ce projet a bénéficié de la contribution de la communauté des programmeurs de Go, et il a été expérimenté dans Go PlayGround, le service web fonctionnant sur les serveurs de golang.org. Les changements ajoutant au langage le support des génériques seront rétrocompatibles, de sorte que les programmes Go existants continueraient à fonctionner. La version actuelle de Go est la version 1.15, la version 1.16 étant actuellement en phase bêta. Une version de production de Go 1.16 est prévue pour le mois prochain.