GoSuda

Aperçu de la version Go 1.24 : tables de hachage Swiss, ML-KEM, os.Root et testing/synctest

By Lemon Mint views ...

Go 1.24 se profile comme une version majeure, introduisant une série d'améliorations axées sur les performances, la sécurité et l'expérience des développeurs. Ces évolutions visent à rendre Go encore plus puissant et efficace pour le développement d'applications modernes.

Amélioration des performances

Une amélioration générale des performances, avec une réduction de 2 à 3 % de la surcharge CPU sur un ensemble de benchmarks représentatifs. Ces améliorations comprennent une nouvelle implémentation intégrée de map, une allocation mémoire plus efficace des petits objets et une nouvelle implémentation de mutex interne au runtime. Les résultats peuvent varier selon l'application.

Cryptographie post-quantique

Introduction du package crypto/mlkem, qui implémente ML-KEM-768 et ML-KEM-1024. ML-KEM est un mécanisme d'échange de clés post-quantique anciennement connu sous le nom de Kyber et spécifié dans la norme FIPS 203. Cet ajout prépare Go à l'avenir de la sécurité cryptographique.

Amélioration de TLS

Prise en charge d'Encrypted Client Hello (ECH) dans TLS. Cette fonctionnalité peut être activée en renseignant le champ Config.EncryptedClientHelloKeys, renforçant la confidentialité et la sécurité des connexions TLS.

Nouvelle map Swiss Table

Une implémentation de map améliorée pour de meilleures performances. Cette nouvelle implémentation repose sur les Swiss Tables et peut être désactivée à l'aide de l'option de compilation GOEXPERIMENT=noswissmap.

Mise à jour de sync.Map

Amélioration des performances des modifications de map dans sync.Map. Les modifications portant sur des ensembles disjoints de clés sont beaucoup moins susceptibles de entrer en contention sur les maps de grande taille, et il n'est plus nécessaire d'attendre une phase de montée en charge pour atteindre des chargements à faible contention depuis la map. En cas de problème, vous pouvez revenir à l'ancienne implémentation en utilisant GOEXPERIMENT=nosynchashtriemap.

Encodage JSON amélioré

Une nouvelle option de tag omitempty permettant une omission plus intelligente des champs de struct lors de l'encodage JSON. Lors de la sérialisation, un champ de struct doté de l'option omitempty sera omis si sa valeur est nulle. Si le type du champ possède une méthode IsZero() bool, celle-ci sera utilisée pour déterminer si la valeur est nulle.

Nettoyage au niveau du runtime

Introduction de la fonction AddCleanup pour remplacer SetFinalizer afin d'obtenir une meilleure gestion des ressources. Contrairement à SetFinalizer, elle ne ressuscite pas l'objet auquel elle est rattachée pour le finaliser, et plusieurs fonctions de nettoyage peuvent être attachées à un même objet. Le nouveau code doit privilégier AddCleanup à SetFinalizer.

Directives d'outils dans go.mod

Amélioration du suivi des dépendances exécutables grâce aux directives d'outils dans go.mod. Cela supprime le besoin de l'ancien contournement consistant à ajouter les outils sous forme d'imports vides dans un fichier conventionnellement nommé « tools.go ».

Accès limité à un répertoire

Nouveau type os.Root pour des opérations contrôlées sur le système de fichiers. Le type os.Root permet d'effectuer des opérations sur le système de fichiers à l'intérieur d'un répertoire spécifique, en empêchant tout accès en dehors du chemin indiqué.

Améliorations des tests

Nouveau package testing/synctest pour tester le code concurrent. La fonction synctest.Run démarre un groupe de goroutines dans une « bulle » isolée, et la fonction synctest.Wait attend que toutes les goroutines de la bulle courante soient bloquées. Ce package est expérimental et doit être activé en définissant GOEXPERIMENT=synctest au moment de la compilation.

Cache de compilation

Les exécutables produits par go run sont désormais mis en cache afin d'accélérer leur exécution. Cela rend les exécutions répétées plus rapides, au prix d'un cache plus volumineux.

Performances de Cgo

Nouvelles annotations #cgo noescape et #cgo nocallback pour améliorer les performances de Cgo. #cgo noescape cFunctionName indique au compilateur que la mémoire passée à la fonction C ne s'échappe pas. #cgo nocallback cFunctionName indique au compilateur que la fonction C n'appelle aucune fonction Go en retour.

Pointeurs faibles

Prise en charge des pointeurs faibles permettant de référencer une mémoire en toute sécurité sans empêcher sa récupération. Les pointeurs faibles sont une primitive de bas niveau destinée à la création de structures économes en mémoire, telles que les maps faibles pour associer des valeurs, les maps de canonicalisation et différents types de caches.

Amélioration des benchmarks

Nouvelle méthode testing.B.Loop pour des benchmarks plus rapides et moins sujets aux erreurs. La fonction de benchmark s'exécute exactement une fois par -count, de sorte que les étapes coûteuses de préparation et de nettoyage ne sont exécutées qu'une seule fois. Les paramètres et résultats des appels de fonction sont maintenus en vie, empêchant le compilateur d'optimiser entièrement le corps de la boucle.

Go 1.24 se profile comme une version majeure, offrant des améliorations substantielles dans différents aspects du langage et de son écosystème.

Overview of Go 1.24