Go 1.26 vient de sortir en février 2026 et c'est une release majeure. Le nouveau garbage collector Green Tea réduit l'overhead GC de 10 à 40%, io.ReadAll est deux fois plus rapide, deux changements syntaxiques modernisent le langage, et la commande go fix a été entièrement réécrite avec 25+ modernizers automatiques. Tour d'horizon des changements qui comptent.
Green Tea GC : le garbage collector nouvelle génération
C'est le changement phare de Go 1.26. Le Green Tea GC remplace l'ancien garbage collector comme implémentation par défaut, avec des gains mesurables en production.
Les chiffres
- 10 à 40% de réduction de l'overhead GC selon la charge de travail
- 10% d'amélioration supplémentaire sur les processeurs AMD64 modernes (Intel Ice Lake, AMD Zen 4+) grâce aux instructions SIMD vectorielles
- Traitement des petits objets (<512 octets) par blocs de 8 KiB, améliorant la localité mémoire
Comment ça fonctionne
Le Green Tea GC améliore trois aspects fondamentaux :
Localité mémoire. Les objets fréquemment accédés ensemble sont regroupés en mémoire, réduisant les cache misses lors du scan GC.
Synchronisation réduite. Moins de points de synchronisation entre les goroutines et le collecteur, ce qui diminue les pauses et la contention.
Scan vectorisé. Sur les processeurs récents, le GC utilise les instructions SIMD pour scanner les petits objets par lots, au lieu de les traiter un par un.
Faut-il faire quelque chose ?
Non. Le Green Tea GC est activé par défaut. Si vous rencontrez une régression dans un cas spécifique, vous pouvez le désactiver temporairement :
GOEXPERIMENT=nogreenteagc go build
Cette option sera supprimée dans Go 1.27. Testez vos applications maintenant pour identifier d'éventuels problèmes.
Performances : les gains mesurés
Au-delà du GC, Go 1.26 apporte des optimisations transversales.
io.ReadAll : 2x plus rapide, 50% moins de mémoire
La fonction io.ReadAll a été optimisée avec un redimensionnement de buffer plus intelligent :
| Métrique | Go 1.25 | Go 1.26 | Gain |
|----------|---------|---------|------|
| Temps (input 65 KiB) | 132.2 µs | 66.32 µs | -49.8% |
| Mémoire allouée | 645.4 KiB | 324.6 KiB | -49.7% |
Si vous utilisez io.ReadAll pour lire des réponses HTTP, des fichiers de configuration ou des flux stdin, le gain est immédiat sans aucune modification de code.
Appels cgo : 30% plus rapides
Les appels cgo (interopérabilité avec le C) sont significativement accélérés :
| Benchmark | Amélioration |
|-----------|-------------|
| CgoCall | -33.4% |
| CgoCallWithCallback | -21.1% |
| Allocations globales | -34.8% |
Pour les projets qui s'interfacent avec des bibliothèques C (SQLite, OpenSSL, librairies système), c'est un gain notable.
Autres optimisations
- JPEG encode/decode : réécriture complète, décodeur 10-14% plus rapide
- JSON parsing : jusqu'à 25% plus rapide pour les gros documents
- Syscalls : ~9% d'amélioration sur Apple M1
- Allocations stack : le compilateur alloue les backing stores de slices sur la stack dans davantage de situations, réduisant la pression sur le heap
Deux nouveautés syntaxiques
Go 1.26 introduit deux changements au niveau du langage. C'est rare pour Go, qui privilégie la stabilité.
new() avec expression initiale
Jusqu'ici, créer un pointeur vers une valeur nécessitait une variable intermédiaire :
// Avant Go 1.26
v := int64(300)
ptr := &v
Go 1.26 permet de passer une expression directement à new() :
// Go 1.26
ptr := new(int64(300)) // *int64 pointant vers 300
Simple, mais ça élimine un pattern verbeux récurrent, notamment dans les tests et les initialisations de structs avec champs optionnels.
Types génériques auto-référentiels
Les types génériques peuvent désormais se référencer eux-mêmes dans leur liste de paramètres :
type Adder[A Adder[A]] interface {
Add(A) A
}
Ce pattern permet de modéliser des structures de données récursives typesafe comme les arbres, les graphes ou les patterns Builder chaînés.
go fix : la modernisation automatique du code
La commande go fix a été entièrement réécrite en utilisant le framework d'analyse de Go (le même que go vet). Elle embarque désormais 25+ modernizers qui transforment automatiquement votre code vers les idiomes modernes.
Les modernizers les plus utiles
# Appliquer tous les modernizers
go fix ./...
any : remplace interface{} par any
// Avant
func process(v interface{}) {}
// Après
func process(v any) {}
minmax : utilise min() et max() builtins
// Avant
if a < b { return a }
return b
// Après
return min(a, b)
slicescontains : remplace les boucles de recherche par slices.Contains
// Avant
for _, v := range slice {
if v == target { return true }
}
return false
// Après
return slices.Contains(slice, target)
rangeint : utilise range N pour les boucles d'itération
// Avant
for i := 0; i < 10; i++ { ... }
// Après
for i := range 10 { ... }
fmtappendf : remplace fmt.Sprintf + concaténation par fmt.Appendf
newexpr : applique la nouvelle syntaxe new(expr) automatiquement
Bonnes pratiques
- Exécutez go fix depuis un état git propre (vous pourrez facilement voir et reverter les changements)
- Lancez-le plusieurs fois : certains fixes sont synergiques
- Sur les gros projets, committez par type de modernizer pour faciliter la review
Sécurité : post-quantique et randomisation heap
Cryptographie post-quantique par défaut
Go 1.26 active par défaut les échanges de clés hybrides post-quantiques dans crypto/tls :
- SecP256r1MLKEM768 et SecP384r1MLKEM1024
- Résistants aux attaques par ordinateur quantique
- Rétrocompatibles avec les serveurs actuels
Le nouveau package crypto/hpke implémente le Hybrid Public Key Encryption (RFC 9180), et crypto/mlkem fournit les primitives ML-KEM pour les tests.
Randomisation de l'adresse de base du heap
Sur les plateformes 64 bits, l'adresse de base du heap est désormais randomisée à chaque exécution. C'est une mesure de sécurité contre les attaques par prédiction d'adresse mémoire, similaire à l'ASLR au niveau de l'OS mais appliquée au runtime Go.
Fonctionnalités expérimentales
Trois features opt-in méritent l'attention :
SIMD natif (GOEXPERIMENT=simd) : opérations vectorielles 128/256/512 bits sur AMD64. Pour le traitement de données en masse, l'encodage ou le calcul numérique.
Secret erasure (GOEXPERIMENT=runtimesecret) : effacement sécurisé des temporaires cryptographiques en mémoire. Indispensable pour les applications manipulant des clés privées.
Goroutine leak profiler (GOEXPERIMENT=goroutineleakprofile) : détecte les goroutines bloquées sur des primitives de concurrence devenues inaccessibles. Un outil précieux pour le debug de fuites mémoire.
Breaking changes à surveiller
Avant de migrer, vérifiez ces points :
- Validation stricte des deux-points dans les URLs : net/url rejette certains hostnames avec colons. Opt-out temporaire : urlstrictcolons=0
- Cookies HTTP : désormais scopés au Request.Host (pas à l'adresse de connexion)
- ReverseProxy : Director est déprécié, migrez vers le hook Rewrite
- Suppression du port windows/arm 32 bits et de la commande cmd/doc
- Bootstrap : Go 1.24.6 minimum requis pour compiler Go 1.26
- macOS 12 : support maintenu mais Go 1.27 nécessitera macOS 13+
Ce qu'il faut retenir
Go 1.26 est une release orientée performance et outillage. Le Green Tea GC apporte des gains tangibles sans intervention, io.ReadAll et les appels cgo sont nettement plus rapides, et go fix transforme la modernisation de code d'une corvée en une commande automatique.
Pour la migration : mettez à jour, lancez go fix ./..., testez vos benchmarks, et profitez des gains. C'est aussi simple que ça.