- La commande
go fix entièrement réécrite est introduite dans Go 1.26 et permet d’améliorer automatiquement le code afin d’exploiter les fonctionnalités les plus récentes du langage et des bibliothèques
- L’outil détecte des motifs de code via des dizaines d’analyseurs (analyzers) et applique divers modernizers comme
minmax, rangeint et stringscut pour transformer du code répétitif ou obsolète en formes plus modernes
- Pour prendre en charge la nouvelle fonctionnalité
new(expr), un analyseur newexpr a été ajouté afin de simplifier automatiquement des fonctions utilitaires comme newInt
go fix produit un effet de synergie lorsqu’il est exécuté plusieurs fois : différents analyseurs peuvent proposer des améliorations successives, avec fusion automatique en cas de conflit et suppression des imports inutiles
- L’équipe Go prévoit à l’avenir d’étendre l’outil via un paradigme d’analyse « libre-service » (Self-service), afin de permettre aux développeurs de définir et diffuser des modernizers pour leurs propres API
Aperçu de la commande go fix
- Dans Go 1.26,
go fix a été entièrement réimplémenté pour fournir une conversion automatique des bases de code vers un style Go moderne
- La commande
go fix ./... modifie tous les packages sous le répertoire courant
- L’option
-diff permet de prévisualiser les changements
- La liste des analyseurs enregistrés peut être consultée avec
go tool fix help, avec diverses règles de transformation comme any, forvar, mapsloop, minmax, etc.
- Pour exécuter un seul analyseur, utilisez un drapeau comme
-any ; pour l’exclure, indiquez -any=false
- En tenant compte des différences de code selon la plateforme, il peut être exécuté plusieurs fois pour différentes combinaisons
GOOS, GOARCH
Modernizers — outils de modernisation du code
- Depuis Go 1.18, l’introduction des génériques a fortement accru les possibilités de simplification du code
- Exemples : collecte des clés d’une map avec
maps.Keys, séparation de chaînes avec strings.Cut
- Pour corriger le fait que les outils de génération de code basés sur les LLM conservent souvent des motifs obsolètes, l’article souligne la nécessité de mettre à jour le code open source avec les idiomes Go les plus récents
- Les modernizers inclus dans
go fix et gopls améliorent la lisibilité du code et son intérêt pédagogique
- Exemples de modernizers :
- minmax : remplace une instruction
if par les fonctions min/max
- rangeint : convertit une boucle
for à 3 clauses en range-over-int
- stringscut : simplifie du code basé sur
strings.Index en utilisant strings.Cut
La fonctionnalité new(expr) de Go 1.26
- La fonction
new est étendue pour accepter un argument de valeur, permettant une initialisation sous la forme new("go1.26")
- L’analyseur
newexpr repère des fonctions utilitaires comme newInt, les simplifie en return new(x), puis remplace les appels par new(expr)
- Cette transformation n’est appliquée que si la version minimale de Go est satisfaite (par exemple avec la directive
go 1.26)
- Elle peut être appliquée à toute la base de code via la commande
$ go fix -newexpr ./...
- Après usage, les fonctions utilitaires devenues inutiles peuvent être identifiées avec l’outil
deadcode
Synergie et gestion des conflits
- Une modification peut créer un effet de synergie en ouvrant la voie à d’autres corrections
- Exemple : après application de
minmax, des transformations supplémentaires peuvent être proposées
- Une optimisation en chaîne peut aller de
stringsbuilder vers fmt.Fprintf
go fix utilise un algorithme de fusion à 3 voies pour fusionner automatiquement les conflits de modification
- En cas de conflit syntaxique, la modification concernée est ignorée et un avertissement est affiché
- Les conflits sémantiques (par ex. suppression de variable, import non utilisé) nécessitent un ajustement manuel
- Les imports inutiles sont supprimés automatiquement
Intégration avec le framework d’analyse Go
go vet et go fix sont intégrés pour partager un framework d’analyse commun
vet se concentre sur la détection d’erreurs, fix sur les corrections automatiques sûres
- Les analyseurs peuvent être exécutés dans divers drivers comme
unitchecker, multichecker, gopls, staticcheck et Tricorder
- Le système de facts permet de partager des informations entre packages
- Exemple : déduire que
log.Printf est un wrapper de fmt.Printf
gopls fournit des diagnostics en temps réel et des propositions de correction automatique
Améliorations de l’infrastructure d’analyse
- L’extension du package inspector améliore l’efficacité de parcours de l’AST, avec un type
Cursor permettant une navigation haut/bas/gauche/droite
- L’indexation des appels de fonction via typeindex peut accélérer l’analyse jusqu’à 1000 fois
- Autres améliorations :
- fourniture du graphe de dépendances de la bibliothèque standard
- prise en charge de requêtes de version Go par fichier
- enrichissement des primitives de refactoring pour des modifications sûres du code, comme la mise en commentaire
- Certains modernizers sont exclus en raison de changements de comportement subtils (cas
append([]string{}, slice...) → slices.Clone(slice))
- Sont également prévus : un moteur de pattern matching, un harnais de test automatisé et une bibliothèque d’opérateurs de correction précis
Paradigme Self-service
- À partir de Go 1.26, l’introduction d’un modèle d’analyse en libre-service est annoncée
- Les développeurs pourront définir et distribuer des modernizers pour leurs propres API
- Ils pourront être exécutés au niveau du projet sans procédure d’approbation centralisée
- En première étape, une fonctionnalité d’inliner piloté par annotations est incluse en aperçu
- Feuille de route :
- exécution d’analyseurs personnalisés via chargement dynamique (dans
go fix ou gopls)
- généralisation des vérifications basées sur le flux de contrôle, par exemple vérifier des invariants comme « open puis close » ou « lock puis unlock »
- L’objectif est d’améliorer l’efficacité de maintenance et de favoriser l’adoption rapide des fonctionnalités Go les plus récentes
Aucun commentaire pour le moment.