Go 1.27 ajoute les méthodes génériques et un encoding/json plus rapide
Go 1.27 est sorti le 19 août 2026 avec des méthodes génériques, un moteur v2 sous encoding/json, des profils de fuite de goroutines et des signatures post-quantiques.
4 min de lecture

Go 1.27 est sorti le 19 août 2026, et il modifie le langage lui-même. Les méthodes peuvent désormais déclarer leurs propres paramètres de type, ce que Go refusait depuis l'arrivée des génériques. Nicholas Husin a annoncé la version sur le blog Go au nom de l'équipe.
Deux autres changements toucheront plus de programmes que le travail sur le langage. Le paquet JSON standard tourne sur un nouveau moteur, et l'exécution sait dire quelles goroutines ont fui.
Les méthodes génériques, et leur unique limite
Avant cette version, un type pouvait être générique mais ses méthodes ne pouvaient pas ajouter leurs propres paramètres de type. Les auteurs écrivaient une méthode par type concret.
Les notes de version citent math/rand/v2.Rand en exemple. Sa méthode s'écrit maintenant (*Rand) N[Int intType](Int) Int. Une seule méthode couvre tous les types entiers.
Une restriction ferme demeure. Les méthodes d'interface ne peuvent pas déclarer de paramètres de type, donc une méthode générique ne peut pas implémenter une méthode d'interface. Cette frontière est délibérée et n'est pas un manque temporaire.
Deux changements de langage plus petits l'accompagnent. Une clé dans un littéral de structure "may now be any valid field selector for the struct type", ce qui permet de renseigner directement les champs imbriqués et embarqués. Et l'inférence de type des fonctions "has been generalized to apply in all assignment contexts", y compris les littéraux composites, les conversions et les envois sur canal.
encoding/json tourne maintenant sur v2
Le paquet encoding/json repose désormais sur une implémentation v2. L'API v1 reste, et les notes de version disent explicitement qu'elle n'est pas dépréciée. Aucune migration n'est requise.
Les valeurs par défaut sont devenues plus strictes, et c'est là que du code qui marchait peut casser. Le moteur v2 rejette l'UTF-8 invalide dans les chaînes JSON. Il rejette aussi les noms en double dans un objet JSON. Les deux passaient auparavant.
| Changement | Effet |
|---|---|
| UTF-8 invalide dans les chaînes | Désormais rejeté |
| Clés d'objet en double | Désormais rejetées |
| Vitesse d'Unmarshal | Nettement plus rapide |
| Vitesse de Marshal | À peu près identique |
Tags format et unknown | Retirés en v2 |
Option de tag inline | Renommée en embed |
Si quelque chose casse, GOEXPERIMENT=nojsonv2 rétablit l'ancienne implémentation à la compilation. Traitez cela comme une échéance, pas comme un correctif. Les notes de version indiquent que ce retrait devrait disparaître dans une version future.
Deux nouveaux paquets arrivent avec : encoding/json/v2, qui prend des options variadiques, et encoding/json/jsontext pour travailler au niveau des jetons.
Profils de fuite, allocation et signatures post-quantiques
Le profil de fuite de goroutines est maintenant disponible en version générale dans runtime/pprof, après avoir été expérimental en Go 1.26. Une goroutine ayant fui est "a goroutine blocked on some concurrency primitive (channels, sync.Mutex, sync.Cond, etc) that cannot possibly become unblocked".
L'exécution les repère grâce au ramasse-miettes. Si une goroutine bloquée attend une chose qu'aucune goroutine exécutable ne peut plus atteindre, elle ne se réveillera jamais. Lisez-le sur /debug/pprof/goroutineleak. Un angle mort est annoncé : les fuites sur des primitives accessibles via des variables globales peuvent être manquées.
L'allocation est devenue moins chère. Le compilateur appelle désormais des routines d'allocation spécialisées par taille, réduisant jusqu'à 30% le coût des allocations sous 80 octets. Les notes de version chiffrent le gain global à environ 1% pour du code gourmand en allocations, et le binaire grossit d'environ 60 Ko.
Pour les équipes sécurité, crypto/mldsa implémente ML-DSA, le schéma de signature post-quantique de FIPS 204. TLS 1.3 gagne les schémas MLDSA44, MLDSA65 et MLDSA87, et x509 gère les clés.
Ce que cela signifie pour les développeurs
Lisez les suppressions avant de mettre à jour, car la casse est là. Go 1.27 exige désormais macOS 13 Ventura ou plus récent. Il abandonne le système de gestion de versions bzr, donc les modules hébergés sur bzr ne peuvent plus être récupérés.
Plusieurs échappatoires GODEBUG ont disparu, et l'une d'elles change le comportement. Avec le retrait d'asynctimerchan, les canaux créés par le paquet time sont désormais toujours non tamponnés. Si vous avez écrit du code autour du comportement tamponné, ce code tourne sous un autre contrat.
Le changement JSON mérite un passage en préproduction plutôt qu'une lecture. Une analyse plus stricte échoue sur des données que vous acceptez déjà, et les clés en double viennent surtout des systèmes des autres, pas de vos tests. Pointez la nouvelle compilation vers de vraies charges de production avant de livrer.
Activez le profil de fuite même si rien ne semble anormal. C'est gratuit, c'est stable désormais, et une goroutine bloquée pour de bon retient sa pile et tout ce que la pile référence. Cette classe de bogue se manifeste rarement comme une erreur, seulement comme de la mémoire qui ne revient jamais.
Une dernière vérification pour qui fait des choses astucieuses avec les valeurs de fonction. Le compilateur génère des noms plus simples pour les fermetures, donc les tests qui vérifient des noms de symboles peuvent demander une mise à jour. Le code qui compare des pointeurs de fonction pour l'égalité était toujours incorrect, et cette version l'expose plus souvent.
Sources
- Go 1.27 is released - The Go Blog
- Go 1.27 Release Notes - go.dev
Articles liés

Un binaire strip trafiqué peut piéger tout NixOS
Des chercheurs ont construit l'attaque trusting-trust de Ken Thompson à partir de GNU strip, et non d'un compilateur, pour piéger presque tous les binaires d'un installateur NixOS.

LLVM débat de compiler ClangIR par défaut
Une RFC LLVM propose de compiler ClangIR dans Clang par défaut. Personne ne l'utiliserait sans drapeau, mais des estimations doublent les temps de compilation.

Debian Code Search supprime sa dernière dépendance cgo
Michael Stapelberg a remplacé une bibliothèque C vieille de 7 ans par du Go pur utilisant le paquet SIMD expérimental, et a égalé la vitesse de la version C.