Go 1.10 est disponible : améliorations de la chaine d'outils, du runtime et des bibliothèques
mais aucun changement important dans le langage lui-même

L'équipe derrière le langage de programmation Go de Google a récemment publié la version stable de Go 1.10. Cette nouvelle itération arrive six mois après la sortie de Go 1.9. La plupart de ses changements se situent au niveau de l'implémentation de la chaine d'outils, du runtime et des bibliothèques. En résumé, Go 1.10 améliore la mise en cache des paquets construits, ajoute la mise en cache des résultats de tests réussis, exécute automatiquement la commande vet pendant les tests, et permet de transmettre des valeurs de chaîne directement entre Go et C en utilisant Cgo.

En d'autres termes, cette mise à jour introduit des améliorations de la chaine d'outils, du runtime et des bibliothèques, mais aucun changement important dans le langage lui-même. Avec Go 1.10, Google maintient également sa promesse de compatibilité avec Go 1 et s'attend donc à ce que presque tous les programmes Go continuent de se compiler et fonctionner comme avant. Avec un peu plus de détails, voici les principaux changements et améliorations dans Go 1.10.

Construction et installation

La commande go build détecte désormais les packages obsolètes essentiellement en fonction du contenu des fichiers source, des flags de build spécifiés et des métadonnées stockées dans les packages compilés. Comme autres changements, les options go build -asmflags, -gcflags, -gccgoflags et -ldflags s'appliquent désormais par défaut uniquement aux packages listés directement sur la ligne de commande.

Dans Go 1.10, la commande go build maintient également un cache de paquets récemment construits, séparés des paquets installés dans $GOROOT/pkg ou $GOPATH/pkg. L'effet du cache devrait être d'accélérer les builds qui n'installent pas explicitement les paquets ou pendant le passage entre différentes copies du code source. La commande go install n'installe maintenant que les paquets et les commandes listés sur la ligne de commande. Pour forcer l'installation des dépendances, les développeurs doivent utiliser le flag go install -i. L'équipe de Google explique toutefois que l'installation de paquets de dépendances ne devrait pas être nécessaire en général, et le concept même des paquets installés pourrait disparaître dans une future version.

Il faut noter que de nombreux détails de l'implémentation de go build ont été modifiés pour prendre en charge ces améliorations.

Tests

L'un des premiers changements ici est que la commande go test met maintenant en cache les résultats du test. À cela, s'ajoute le fait que la commande go test exécute désormais de manière automatique go vet sur le paquet testé, afin d'identifier les problèmes significatifs avant d'exécuter le test.

Dans Go 1.10, le flag go test -coverpkg interprète désormais son argument comme une liste de modèles séparés par des virgules à confronter aux dépendances de chaque test. Le nouveau flag go test -failfast désactive l'exécution de tests supplémentaires après l'échec d'un test. Entre autres changements relatifs aux tests, il faut également noter que le nouveau flag go test -json filtre la sortie de test via la nouvelle commande go tool test2json pour produire une description de l'exécution du test dans un format JSON qui est plus compréhensible par la machine. Comme l'explique l'équipe Go, cela permet de créer une présentation riche de l'exécution de tests dans les IDE et autres outils.

Cgo

Les options spécifiées par cgo en utilisant #cgo CFLAGS et les options similaires sont maintenant vérifiées dans une liste blanche d'options autorisées. Ce changement, selon Google, vise à corriger un trou de sécurité qui permet à un paquet téléchargé d'utiliser les options de compilateur comme -fplugin pour exécuter du code arbitraire sur la machine sur laquelle il est construit. Cela peut provoquer une erreur de génération telle qu'un flag non valide dans #cgo CFLAGS.

Soulignons également que Cgo, l'outil qui permet aux programmes Go de fonctionner de manière interopérable avec les bibliothèques C, implémente maintenant un typedef C comme "typedef X Y" en utilisant un alias de type Go, de sorte que le code Go puisse utiliser les types C.X et C.Y de manière interchangeable. Entre autres changements ici, notons encore que Cgo prend désormais en charge l'accès direct aux valeurs de chaine Go à partir de C.


Autres changements

Il n'y a pas de nouveaux systèmes d'exploitation ou architectures de processeur pris en charge dans cette version de Go. La plupart des travaux ont porté sur le renforcement du support des ports existants, en particulier de nouvelles instructions dans l'assembleur et des améliorations du code généré par les compilateurs.

Côté performance, l'équipe Go explique que comme toujours, les changements sont si généraux et variés que des affirmations précises sur la performance sont difficiles à faire. Toutefois, la plupart des programmes devraient s'exécuter un peu plus rapidement, en raison des accélérations dans le récupérateur de mémoire, d'une meilleure génération de code et des optimisations dans la bibliothèque principale. À propos des améliorations dans le récupérateur de mémoire, l'équipe Go explique par exemple que de nombreuses applications devraient connaître une latence d'allocation significativement plus faible. En ce qui concerne la bibliothèque standard, toutes les modifications dont elle a bénéficié sont mineures.

Sources : Notes de version de Go 1.10

Et vous ?

Avez-vous déjà utilisé (ou utilisez-vous souvent) le langage Go ? Comment le jugez-vous ?
Que pensez-vous de cette nouvelle version ?

Voir aussi :

Quels avantages ou inconvénients trouvez-vous au langage Go ? Schörghuber raconte son aventure avec Go et finit par le rejeter pour diverses raisons
Le langage Go monte fortement en popularité d'après des données de l'index TIOBE, mais semble ne pas l'être en France
Go : après 5 ans de Go 1, la communauté du langage open source planifie une transition vers Go 2, en minimisant les perturbations entre les versions