Les améliorations importantes de Go 1.24
(gosuda.org)La version Go 1.24 s’annonce comme une release majeure, avec de nombreuses améliorations axées sur les performances, la sécurité et l’expérience développeur. Ces changements visent à rendre Go encore plus puissant et plus efficace pour construire des applications modernes.
Améliorations des performances
Des gains de performance généraux ont permis de réduire la surcharge CPU de 2 à 3 % sur une suite de benchmarks représentative. Ces améliorations incluent une nouvelle implémentation intégrée de map, une allocation mémoire plus efficace pour les petits objets, ainsi qu’une nouvelle implémentation interne des mutex du runtime. Les résultats peuvent varier selon les applications.
Cryptographie résistante au quantique
Le package crypto/mlkem, qui implémente ML-KEM-768 et ML-KEM-1024, a été introduit. ML-KEM, auparavant connu sous le nom de Kyber, est un mécanisme d’échange de clés résistant au quantique défini dans la norme FIPS 203. Cet ajout permet à Go de mieux se préparer aux futurs enjeux de sécurité cryptographique.
Client Hello chiffré
La prise en charge d’ECH (Encrypted Client Hello) dans TLS est désormais disponible. Cette fonctionnalité peut être activée en renseignant le champ Config.EncryptedClientHelloKeys, ce qui renforce la confidentialité et la sécurité des connexions TLS.
Nouvelle Swiss Table Map
Une implémentation améliorée de map pour de meilleures performances. Cette nouvelle implémentation repose sur les Swiss Tables et peut être désactivée avec le flag de build GOEXPERIMENT=noswissmap.
Mise à jour de Sync Map
Les performances de modification des maps dans sync.Map ont été améliorées. Les modifications sur des ensembles de clés disjoints sont désormais bien moins susceptibles d’entrer en contention sur de grandes maps, et le temps de préparation auparavant nécessaire pour obtenir une faible contention n’est plus requis. En cas de problème, il est possible de revenir à l’implémentation précédente avec GOEXPERIMENT=nosynchashtriemap.
Amélioration du marshaling JSON
Une nouvelle option de tag omitempty permet d’omettre plus intelligemment les champs de structures lors du marshaling JSON. Lors du marshaling, si la valeur d’un champ de structure portant l’option omitempty est nulle ou zéro, il est omis. Si le type du champ possède une méthode IsZero() bool, celle-ci est utilisée pour déterminer si la valeur est nulle ou zéro.
Nettoyage du runtime
La fonction AddCleanup, destinée à remplacer SetFinalizer, a été introduite pour améliorer la gestion des ressources. Contrairement à SetFinalizer, elle ne ressuscite pas l’objet associé pour la finalisation et permet d’attacher plusieurs nettoyages à un même objet. Le nouveau code devrait privilégier AddCleanup à SetFinalizer.
Directive tool dans go.mod
Le suivi des dépendances d’outils a été amélioré grâce à la directive tool dans go.mod. Cela évite d’avoir recours à l’ancien contournement consistant à ajouter les outils par import vide dans un fichier portant conventionnellement le nom de "tools.go".
Accès limité aux répertoires
Un nouveau type os.Root est introduit pour effectuer des opérations contrôlées sur le système de fichiers. Le type os.Root permet d’exécuter des opérations sur les fichiers uniquement dans un répertoire donné, empêchant ainsi tout accès en dehors du chemin spécifié.
Améliorations des tests
Le nouveau package testing/synctest est destiné aux tests de code concurrent. La fonction synctest.Run lance un groupe de goroutines dans une « bulle » isolée, et la fonction synctest.Wait attend que toutes les goroutines de la bulle en cours soient bloquées. Ce package est expérimental et doit être activé au moment de la compilation avec GOEXPERIMENT=synctest.
Cache de build
Les exécutables de go run sont désormais mis en cache pour permettre une exécution plus rapide. Cela accélère les exécutions répétées, au prix d’un cache plus volumineux.
Performances de Cgo
De nouvelles annotations #cgo noescape et #cgo nocallback ont été ajoutées pour améliorer les performances de Cgo. #cgo noescape cFunctionName indique au compilateur que la mémoire transmise à la fonction C ne s’échappe pas. #cgo nocallback cFunctionName indique au compilateur que la fonction C ne rappellera pas de fonction Go.
Pointeurs faibles
La prise en charge des pointeurs faibles permet de référencer la mémoire de manière sûre sans empêcher sa récupération. Les pointeurs faibles constituent un mécanisme bas niveau destiné à créer des structures économes en mémoire, comme des maps faibles pour l’association de valeurs, des maps de canonicalisation et différents types de caches.
Améliorations des benchmarks
La nouvelle méthode testing.B.Loop permet d’écrire des benchmarks plus rapides et moins sujets aux erreurs. Les fonctions de benchmark ne sont exécutées qu’une seule fois par -count, ce qui permet de n’exécuter qu’une seule fois les étapes coûteuses de configuration et de nettoyage. Les paramètres d’appel de fonction et les résultats sont conservés, empêchant ainsi le compilateur d’optimiser complètement le corps de la boucle.
La version Go 1.24 s’annonce comme une release importante, apportant des améliorations significatives à de nombreux aspects du langage et de son écosystème.
4 commentaires
Celles et ceux qui utilisent Go, y a-t-il des fonctionnalités que vous aimeriez voir arriver ?
Moi, j’aimerais bien avoir des opérateurs comme
.?et??, et si possible des macros.Honnêtement, les struct tags sont une erreur.
Personnellement, j’aimerais vraiment qu’il y ait des macros, s’il vous plaît. Jusqu’à quand faudra-t-il continuer à faire du
generate? snifJe me demande pourquoi les
struct tagssont considérés comme une erreur.Le plus gros problème, c’est qu’il est difficile de bénéficier de l’aide des outils.
gomodifytagsexiste aussi depuis longtemps, mais son intégration avec l’extension Go de VSC a également été assez tardive.