- La prochaine version de Go 1.22 prévoit de corriger une erreur classique liée à la portée des boucles
for, qui a causé des problèmes en production dans de nombreuses entreprises.
- Le problème survient lorsqu’une référence à la variable de boucle est conservée après la fin de l’itération et se retrouve ainsi avec une nouvelle valeur non intentionnelle.
- Ce problème est courant à la fois dans le code Go concurrent et non concurrent, et il a été difficile à identifier et à corriger en raison de la complexité de l’analyse visant à déterminer si une référence à la variable dépasse l’itération.
- Les outils existants pour repérer ce type d’erreurs produisent souvent des faux négatifs ou des faux positifs, entraînant des modifications de code inutiles ou des problèmes passés inaperçus.
- Le correctif proposé dans Go 1.22 modifiera les boucles
for afin qu’elles aient une portée par itération plutôt qu’une portée sur l’ensemble de la boucle, ce qui éliminera ce type d’erreurs ainsi que le besoin d’outils imprécis.
- Pour préserver la rétrocompatibilité, la nouvelle sémantique ne s’appliquera qu’aux packages inclus dans des modules déclarant Go 1.22 ou une version ultérieure dans le fichier
go.mod.
- Les développeurs pourront contrôler à quel moment la sémantique change pour certains packages, et le code existant continuera à fonctionner comme aujourd’hui.
- Go 1.21 inclut un aperçu de ce changement de portée, activable en définissant
GOEXPERIMENT=loopvar dans l’environnement.
- Ce changement a été largement testé chez Google, sans problème signalé dans le code de production.
- En revanche, certains tests devront être corrigés, car des problèmes liés aux variables de boucle les empêchaient de tester ce qu’ils étaient censés vérifier à l’origine.
- L’analyseur
loopclosure de Go 1.21 a été amélioré pour mieux identifier et signaler ce type de problèmes, afin d’aider les développeurs à se préparer aux changements de Go 1.22.
- Davantage d’informations sur ce changement sont disponibles dans le document de conception et la FAQ.
1 commentaires
Avis Hacker News
for loopsdans « Go 1.22 », centrée sur la mauvaise utilisation des variables de boucle dans les closures