Google a livré la version de production de Go 1.20, son langage open source maison réputé pour sa simplicité, sa concurrence et ses fonctionnalités de programmation fonctionnelle. Cette mise à jour apporte de l'optimisation guidée par le profil (profile-guided optimization, PGO, appelée aussi feedback-directed optimization) pour le compilateur, c’est-à-dire la possibilité pour la chaîne d'outils du compilateur d'effectuer des optimisations spécifiques à l'application et à la charge de travail en fonction des données du profil d'exécution.

Actuellement, le compilateur prend en charge les profils CPU pprof, qui peuvent être collectés via les paquets runtime/pprof ou net/http/pprof. L'optimisation guidée par le profil consiste à renvoyer des informations (un profil) provenant d'exécutions représentatives de l'application au compilateur pour la prochaine version de l'application, qui utilise ces informations pour prendre des décisions d'optimisation plus éclairées. Les benchmarks d'un ensemble représentatif de programmes Go montrent que l'activation de l'optimisation Inlining de PGO améliore les performances d'environ 3 à 4 %. D'autres optimisations PGO sont prévues pour les prochaines versions.  

Les changements dans le langage au crible

Go 1.20 introduit également quatre changements dans le langage. Tout d'abord, une amélioration apportée dans la version Go 1.17 de 2021 - la possibilité de convertir un slice en un pointeur de tableau- a été étendue pour permettre les conversions de slice en tableau (array), selon les notes de version provisoires. Ensuite, le paquet unsafe définit trois nouvelles fonctions : SliceData, String, et StringData. Ces fonctions offrent la possibilité complète de construire et de déconstruire des valeurs de slice et de string sans dépendre de la représentation exacte.

Troisième apport : la spécification définit désormais que les valeurs struct sont comparées un champ à la fois, en considérant les champs dans l'ordre où ils apparaissent dans la définition du type struct et en s'arrêtant à la première discordance. Enfin; les types comparables comme les interfaces ordinaires peuvent à présent satisfaire aux contraintes comparables, même si les arguments de type ne sont pas strictement comparables. Cela permet l'instanciation d'un paramètre de type contraint par comparable avec un argument de type non strictement comparable tel qu'un type interface, ou un type composite contenant un type interface. 

Des améliorations variées

- La collecte de profils de couverture de code pour les programmes est prise en charge, y compris pour les applications et les tests d'intégration, par opposition aux seuls tests unitaires ;

- Le répertoire $GOROOT/pkg ne stocke plus les activités de paquet précompilées pour la bibliothèque standard. Désormais, les paquets de la bibliothèque sont construits selon les besoins et mis en cache dans le cache de construction. Cela réduit la taille de la distribution Go et évite le déséquilibre de la chaîne d'outils C pour les paquets qui utilisent cgo ;

- L'implémentation de go test -json a été améliorée pour être plus robuste. Les programmes qui exécutent go test -json n'ont pas besoin de mises à jour ;

- La commande go définit désormais les balises de construction des fonctionnalités d'architecture ;

- La commande go désactive dorénavant cgo par défaut sur les systèmes ne disposant pas d'une chaîne d'outils C ;

- La commande go version -m prend à présent en charge la lecture d'un plus grand nombre de types de binaires Go, notamment les DLL Windows construites avec go build- buildmode=c shared et les binaires Linux sans permission d'exécution ;

- Un support expérimental a été ajouté pour FreeBSD sur RISC-V.

Annoncée le 1er février, Go 1.20 est téléchargeable sur go.dev. Cette itération sera la dernière version à fonctionner sous macOS 10.13 High Sierra ou 10.14 Mojave. Go 1.21 nécessitera macOS 10.15 Catalina ou une version ultérieure. La version Go 1.19 précédente, qui améliorait les génériques et le modèle de mémoire, a été publié le 2 août.