ProgrammationDéveloppeur Go

Comment fonctionne l'ombre des variables en Go ? Pourquoi cette caractéristique du langage peut-elle entraîner des erreurs difficiles à détecter lors de la programmation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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 piège

Question : "Que va afficher le code suivant ?"

x := 7 if true { x, y := 1, 2 fmt.Println(x, y) } fmt.Println(x)

Réponse :

  • À l'intérieur du if, de nouvelles variables x et y seront déclarées. Elles ne sont disponibles que dans le bloc if.
  • En dehors du bloc, la variable x est la même que la variable externe, sa valeur ne changera pas.

Conclusion :

1 2
7

Exemples d'erreurs réelles dues à des malentendus sur la subtilité


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.