Go 1.14, la dernière version du langage de programmation open source développé par Google, qui a servi à créer Docker, Kubernetes, Istio et d'autres projets clouds natifs, est désormais disponible en version de production. Sortie le 25 février, cette mise à jour améliore le runtime et le compilateur. Cette version sera également la dernière à supporter les plateformes 32 bits d'Apple, selon les notes de publication.
Les améliorations du runtime de Go ont un impact sur les performances de la plupart des cas d’usage de la fonction de report « defer » en évitant pratiquement toute surcharge, comparativement à l'appel direct de la fonction. Désormais, la fonction de report peut être utilisée dans un code devant répondre à des performances critiques sans problème de surcharge. L'amélioration du runtime de Go rend également les goroutines asynchrone préemptibles. Cela signifie que les boucles sans appel de fonction ne risquent plus de bloquer le programmateur, ni de retarder significativement la collecte des déchets. Cette fonctionnalité est supportée sur toutes les plateformes, à l'exception de windows/arm, darwin/arm, js/wasm et plan9/*.
L’une des conséquences de l’implémentation de la préemption, c’est que, sous Linux et MacOS, les programmes Go 1.14 recevront plus de signaux que les versions précédentes. Dans les programmes utilisant des paquets du genre syscall ou golang.org/x/sys/unix, les appels système plus lents ne seront pas exécutés et génèreront des erreurs EINTR. Ces programmes devront traiter ces erreurs d'une manière ou d'une autre, très probablement en ajoutant une boucle pour réessayer l'appel système. Par ailleurs, l'allocateur de pages est plus efficace et subit moins de conflits d’accès aux valeurs élevées de GOMAXPROCS. L’impact se ressent surtout dans une latence plus faible et un débit plus élevé pour les allocations importantes effectuées en parallèle et à un rythme élevé.
Les autres améliorations de Go 1.14
Quant au compilateur Go, il ajoute -d=checkptr comme option de compilation pour vérifier que le code Go respecte les règles de sécurité de unsafe.pointer de manière dynamique. En outre, le compilateur peut désormais émettre des logs lisibles par la machine des optimisations les plus notables en utilisant le drapeau -json, y compris l'élimination de l'in-lining et des contrôles de limites. Les diagnostics détaillés de l’analyse d'échappement fonctionnent à nouveau et un support expérimental est offert pour l’insertion de code spécial dans le compilateur pour le fuzzing.
Go 1.14 comporte aussi d’autres les changements et améliorations suivant :
- En vue de l’amélioration du support de WebAssembly par Go, les valeurs JavaScript référencées à partir de Go via js.Value peuvent désormais être collectées par le ramasse-miettes. Cependant, les objets js.Value ne peuvent plus être comparés à l'aide de l'opérateur ==. Ils doivent être comparés par la méthode Equal. De plus, js.Value dispose désormais des méthodes IsUndefined, IsNull et IsNaN.
- À l’image de ce qui se passe pour le langage Rust, la version 1.14 de Go sera la dernière à prendre en charge les binaires 32 bits sous MacOS. Elle sera probablement aussi la dernière à prendre en charge les binaires 32 bits sur d'autres plateformes Apple, notamment iOS, iPadOS, WatchOS et tvOS.
- En cas de changement de langage, l'intégration d'interfaces se chevauchant est désormais autorisée.
- Le support de la plateforme Google Native Client est suspendu.
- L'architecture 64 bits de FreeBSD est désormais supportée.
- La commande go supporte désormais les référentiels Subversion en mode module. Cette commande comporte également des « snippets » de messages d'erreur en texte clair provenant de proxies de modules et d'autres serveurs HTTP. Un message d'erreur n'est affiché que s'il est valide en UTF-8 et ne comporte que des caractères graphiques et des espaces.
- Pour les binaires sous Windows, la prévention de l'exécution des données ou Data Execution Prevention (DEP) est activée pour protéger la mémoire au niveau du système.
- Un nouveau drapeau, -modfile=file, indique à la commande go de lire et éventuellement d'écrire un fichier go.mod alternatif plutôt que celui qui se trouve dans le répertoire root du module.
- La commande go get n'accepte plus le drapeau -mod.
- Un nouveau drapeau, -modcacherw, indique à la commande go de laisser les répertoires nouvellement créés dans le cache du module avec les permissions par défaut plutôt qu'en lecture seule. Ce drapeau rend plus probable l'ajout accidentel par des tests ou d'autres outils de fichiers ne figurant pas dans la somme de contrôle vérifiée du module. Mais il permet l'utilisation de rm-rf pour supprimer le cache du module.
- Un paquet hash/maphash fournit des fonctions de hachage sur des séquences d'octets.
- Une nouvelle variable d'environnement appelée GOINSECURE ordonne à la commande go d'autoriser une connexion HTTPS à passer la validation du certificat lors de la récupération de certains modules directement depuis leur origine.
On peut télécharger Go 1.14 sur golang.org.