1 points par GN⁺ 2023-09-20 | 1 commentaires | Partager sur WhatsApp
  • 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

 
GN⁺ 2023-09-20
Avis Hacker News
  • Discussion sur le problème des for loops dans « Go 1.22 », centrée sur la mauvaise utilisation des variables de boucle dans les closures
  • Le problème de la mauvaise utilisation des variables de boucle dans les closures n’est pas nouveau et remonte au langage Lisp en 1992
  • L’équipe du langage C# a également été confrontée à ce problème et a mis en œuvre un changement important dans C# 5.0 pour le résoudre
  • Go 1.21 ne compile pas le code déclarant l’après-Go 1.22, ce qui garantit qu’un code reposant sur la nouvelle sémantique ne soit pas compilé avec l’ancienne
  • Des inquiétudes existent quant au fait que ce changement puisse casser des programmes qui dépendent du comportement actuel
  • Certains utilisateurs s’interrogent sur le fonctionnement concret si un package est verrouillé sur 1.22 et qu’un utilisateur le compile avec la version 1.18
  • Des questions sont également posées sur l’impact de ce changement sur les allocations mémoire et les performances des boucles
  • Certains utilisateurs partagent avoir rencontré des problèmes similaires dans d’autres langages comme Python
  • Le changement de Go 1.22 semble résoudre un problème de syntaxe du langage, mais il paraît peu intuitif à certains utilisateurs, car il faut connaître la version déclarée dans un fichier pour comprendre le comportement d’un autre fichier