7 points par GN⁺ 2026-02-18 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • 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.

Aucun commentaire pour le moment.