L'ombre (shadowing) est lorsque une variable dans une portée interne cache ("fabrique une ombre") une variable du même nom dans une portée externe. En Go, cela est possible en raison des particularités de l'opérateur d'assignation de variable :=, notamment à l'intérieur des blocs (if, for, switch, etc.).
x := 5 if true { x := 10 // Ce x — une nouvelle variable, ne vaut que dans ce if fmt.Println(x) // 10 } fmt.Println(x) // 5, pas 10
Parfois, cela peut être utile, mais cela conduit souvent à des erreurs si l'on oublie que la variable redéclarée n'est pas la même que la variable extérieure.
Question : "Que va afficher le code suivant ?"
x := 7 if true { x, y := 1, 2 fmt.Println(x, y) } fmt.Println(x)
Réponse :
if, de nouvelles variables x et y seront déclarées. Elles ne sont disponibles que dans le bloc if.x est la même que la variable externe, sa valeur ne changera pas.Conclusion :
1 2
7
Histoire
Fuite de ressources avec l'ombre des erreurs : Une erreur typique est l'ombre de la variable d'erreur lors du travail avec des fichiers.
f, err := os.Open("file.txt") if err != nil { return err } if err := f.Close(); err != nil { return err } // ceci est une nouvelle variable err !
L'opérateur := crée une nouvelle variable err uniquement à l'intérieur du bloc, tandis que la variable externe err reste inchangée. Si le traitement des erreurs est attendu dans la variable externe, cela entraîne une perte d'informations sur les erreurs.
Histoire
Ombre des structures — bugs invisibles: À l'intérieur d'un bloc imbriqué, le développeur a redéfini une structure avec le même nom. En conséquence, une partie de la logique fonctionnait avec la version interne, tandis qu'une autre fonctionnait avec l'externe, ce qui a entraîné des bugs étranges et une perte de données dans le service de facturation.
Histoire
L'ombre dans les boucles casse les comptages :
Dans un système automatisé de traitement des demandes, := a été utilisé au lieu de = pour incrémenter le compteur, ce qui a conduit à la création d'une nouvelle variable à l'intérieur de la boucle qui était incrémentée, tandis que le compteur externe restait inchangé. Le système a sous-estimé les demandes et a faussé des statistiques importantes.