1 points par GN⁺ 2024-02-08 | 1 commentaires | Partager sur WhatsApp
  • La version Go 1.22 sort six mois après Go 1.21.
  • La plupart des changements concernent l’implémentation de la toolchain, du runtime et des bibliothèques.
  • La promesse de compatibilité Go 1 est maintenue, et presque tous les programmes Go devraient continuer à se compiler et à s’exécuter comme auparavant.

Changements du langage

  • Deux changements concernent les boucles "for".
    • Auparavant, les variables déclarées par une boucle "for" étaient créées une seule fois puis mises à jour à chaque itération, mais dans Go 1.22, chaque itération de la boucle crée désormais une nouvelle variable, ce qui évite les bugs de partage involontaire.
    • Les boucles "for" peuvent désormais itérer sur des entiers avec range.

Outils

Commande Go

  • Il est possible de gérer les dépendances dans un workspace en utilisant le répertoire vendor.
  • go get n’est plus pris en charge dans l’ancien mode GOPATH, hors modules.
  • go mod init n’essaie plus d’importer les dépendances du module à partir des fichiers de configuration d’autres outils de vendoring.
  • go test -cover affiche désormais un résumé de couverture pour les packages qui n’ont pas leurs propres fichiers de test.

Trace

  • L’interface web de l’outil trace a été partiellement repensée pour prendre en charge le nouveau traceur.

Vet

  • Le comportement de l’outil vet concernant les variables de boucle a changé.
  • Un nouvel avertissement a été ajouté pour les appels à append qui n’ajoutent aucune valeur.
  • Un nouvel avertissement a été ajouté pour les problèmes pouvant survenir lors de l’utilisation de time.Since dans une instruction defer.
  • Un nouvel avertissement a été ajouté lorsque les paires clé-valeur ne correspondent pas dans les appels à log/slog.

Runtime

  • Les métadonnées du ramasse-miettes basées sur les types sont conservées plus près des objets du tas, ce qui améliore les performances CPU de 1 à 3 %.

Compilateur

  • Les builds avec optimisation guidée par profil (PGO) peuvent désormais dévirtualiser davantage d’appels qu’auparavant.

Éditeur de liens

  • Les flags -s et -w de l’éditeur de liens ont été modifiés pour se comporter de manière plus cohérente sur toutes les plateformes.

Bootstrap

  • Go 1.22 exige désormais, pour le bootstrap, la dernière point release de Go 1.20 ou une version ultérieure.

Bibliothèque standard

Nouveau package math/rand/v2

  • math/rand/v2 est le premier package “v2” de la bibliothèque standard, avec plusieurs changements importants par rapport à math/rand.

Nouveau package go/version

  • Un nouveau package go/version a été ajouté pour implémenter des fonctions de validation et de comparaison des chaînes de version de Go.

Patterns de routage améliorés

  • Le routage HTTP de la bibliothèque standard devient plus expressif.

Changements mineurs dans les bibliothèques

  • Divers changements mineurs et améliorations de performances ont été apportés à plusieurs bibliothèques.

Ports

Darwin

  • Sur macOS, pour l’architecture x86 64 bits (darwin/amd64), la toolchain Go génère désormais par défaut des exécutables indépendants de la position (PIE).

Arm

  • Il est possible de choisir entre virgule flottante logicielle et matérielle via la variable d’environnement GOARM.

Loong64

  • Le port loong64 transmet désormais les arguments et les résultats des fonctions via des registres.

OpenBSD

  • Un port expérimental pour PowerPC 64 bits big-endian (openbsd/ppc64) a été ajouté sur OpenBSD.

Avis de GN⁺

  • Cette sortie de Go 1.22 se distingue notamment par les changements apportés aux boucles "for" et l’introduction du nouveau package math/rand/v2. Ces évolutions apportent de meilleures performances et une plus grande stabilité aux développeurs Go, tout en reflétant l’évolution du langage.
  • Le package math/rand/v2 offre de meilleures capacités de génération aléatoire grâce à des algorithmes plus rapides et une nouvelle API, ce qui constitue une amélioration importante pour la cryptographie et les autres applications dépendantes du hasard.
  • Go 1.22 devrait avoir un impact positif sur la communauté Go en proposant diverses optimisations et nouvelles fonctionnalités qui améliorent à la fois les performances et l’expérience développeur, tout en maintenant la compatibilité.

1 commentaires

 
GN⁺ 2024-02-08
Avis Hacker News
  • Un développeur TypeScript partage son expérience récente de transition vers le langage Go. Au départ, il exprimait des réserves sur le manque de fonctions pour les tableaux en Go et sur un système de types qu’il jugeait peu flexible. Mais en utilisant Go, il a apprécié l’excellence de la bibliothèque standard, la sûreté du typage et les avantages de standards de code intégrés. Il considère aussi positivement l’intégration du routage dans la bibliothèque standard.
  • Un lien vers des notes de version interactives pour Go 1.22 est partagé.
  • Un développeur qui utilise Go depuis plus de 9 ans compare Dart (pour le développement Flutter) et Go. Dart cherche à ajouter toutes les fonctionnalités possibles, tandis que Go poursuit au contraire la simplicité. Dans Dart, la diversité des méthodes d’initialisation des classes devient déroutante, et la simplicité de Go lui manque. Les expressions uniques complexes utilisant les maps/streams de Dart, etc., peuvent semer la confusion lors du débogage ou chez les développeurs débutants.
  • io.Copy peut désormais utiliser l’appel système Linux splice(2) lors d’une copie de TCPConn vers UnixConn. Cette personne apprécie beaucoup les bénéfices que ce type de motif apporte dans le package io.
  • Les motifs de routage ont été améliorés dans Go 1.22, mais cela peut entraîner de petits problèmes de compatibilité. Cela peut être contrôlé via le champ httpmuxgo121.
  • Un développeur n’apprécie pas la fonctionnalité de « portée de fonction » ajoutée au langage Go. Il estime qu’elle n’apporte pas assez de confort au regard de la complexité supplémentaire introduite dans le langage, et qu’elle s’accorde mal avec le style explicite et simple de Go.
  • Un lien vers une discussion sur le fait que chaque itération d’une boucle crée une nouvelle variable dans Go 1.22 est partagé.
  • L’ajout de sql.Null[T] est bien accueilli. Jusqu’ici, cette personne utilisait null de sqlboiler, qui propose une API similaire à sql.Null, avec en plus une méthode IsSet() bool indiquant si la valeur a été explicitement définie.
  • L’ajout du routage à la bibliothèque standard est bien accueilli, et certains envisagent de pouvoir supprimer la bibliothèque chi.
  • Parmi les développeurs qui utilisent Go en production, une question se pose : passent-ils rapidement aux nouvelles versions ou restent-ils sur des releases plus anciennes ? Des avis sont aussi partagés sur l’utilisation du mot-clé any.