Shadowing (Sichtbarkeitsverdeckung) bedeutet, dass eine Variable im inneren Geltungsbereich eine Variable mit demselben Namen im äußeren Geltungsbereich "verdeckt". In Go ist dies aufgrund der Besonderheiten der Variablen-Deklaration := möglich, insbesondere innerhalb von Blöcken (if, for, switch usw.).
x := 5 if true { x := 10 // Dieses x ist eine neue Variable, gültig nur innerhalb dieses if fmt.Println(x) // 10 } fmt.Println(x) // 5, nicht 10
Manchmal ist dies nützlich, führt jedoch häufig zu Fehlern, wenn man vergisst, dass die neu deklarierte Variable nicht dieselbe ist wie die äußere.
Frage: "Was wird der folgende Code ausgeben?"
x := 7 if true { x, y := 1, 2 fmt.Println(x, y) } fmt.Println(x)
Antwort:
if werden neue Variablen x und y deklariert, die nur im Block if verfügbar sind.x die gleiche äußere Variable, ihr Wert ändert sich nicht.Ergebnis:
1 2
7
Geschichte
Ressourcenauslastung durch Shadowing von err: Ein typischer Fehler ist die Sichtbarkeitsverdeckung der Fehler-Variable beim Arbeiten mit Dateien.
f, err := os.Open("file.txt") if err != nil { return err } if err := f.Close(); err != nil { return err } // das ist eine neue Variable err!
Der Operator := erstellt nur eine neue Variable err innerhalb des Blocks, während die äußere Variable err unverändert bleibt. Wenn die Fehlerbehandlung von der äußeren Variable erwartet wird, führt dies zu Informationsverlust über Fehler.
Geschichte
Shadowing von Strukturen — unsichtbare Bugs: Im inneren Block hat der Entwickler eine Struktur mit demselben Namen neu definiert. Als Ergebnis arbeitete ein Teil der Logik mit der inneren Version, während ein anderer Teil mit der äußeren arbeitete, was zu seltsamen Bugs und Datenverlust im Abrechnungssystem führte.
Geschichte
Shadowing in Schleifen zerstört Zählungen:
In einem automatisierten System zur Verarbeitung von Anträgen wurde := anstelle von = verwendet, um den Zähler zu erhöhen, wodurch innerhalb der Schleife eine neue Variable erstellt und erhöht wurde, während der äußere Zähler unverändert blieb. Das System zählte die Anträge nicht korrekt und unterschätzte wichtige Statistiken.