Shadowing (schaduwing) is wanneer een variabele in een interne scope een variabele met dezelfde naam uit een externe scope verbergt ("schaduwt"). In Go is dit mogelijk vanwege de kenmerken van de variabele declaratie blok :=, vooral binnen blokken (if, for, switch, enz.).
x := 5 if true { x := 10 // Deze x is een nieuwe variabele, geldig alleen binnen deze if fmt.Println(x) // 10 } fmt.Println(x) // 5, niet 10
Soms is dit nuttig, maar het leidt vaak tot fouten als je vergeet dat de opnieuw gedeclareerde variabele niet dezelfde is als de externe.
Vraag: "Wat zal de volgende code afdrukken?"
x := 7 if true { x, y := 1, 2 fmt.Println(x, y) } fmt.Println(x)
Antwoord:
if worden nieuwe variabelen x en y gedeclareerd, ze zijn alleen toegankelijk binnen het if-blok.x nog steeds dezelfde externe variabele, de waarde verandert niet.Conclusie:
1 2
7
Verhaal
Hulpbronlek bij shadowing err: Typische fout is het schaduwen van de error variabele bij het werken met bestanden.
f, err := os.Open("file.txt") if err != nil { return err } if err := f.Close(); err != nil { return err } // dit is een nieuwe variabele err!
De operator := creëert een nieuwe variabele err alleen binnen het blok, en de externe variabele err verandert niet. Als error verwerking wordt verwacht in de externe variabele, leidt dit tot verlies van foutinformatie.
Verhaal
Shadowing structuren — onzichtbare bugs: Binnen een genest blok heeft de ontwikkelaar de structuur met dezelfde naam overschreven. Dit leidde ertoe dat een deel van de logica met de interne versie werkte, en een ander deel met de externe, wat leidde tot vreemde bugs en dataverlies in de factureringsservice.
Verhaal
Shadowing in lussen verpest tellingen:
In een geautomatiseerd aanvraagverwerkingssysteem werd := in plaats van = gebruikt om een teller te verhogen, waardoor binnen de lus een nieuwe variabele werd aangemaakt en verhoogd, terwijl de externe teller onveranderd bleef. Het systeem telde aanvragen verkeerd en verlaagde belangrijke statistieken.