Shadowing (oscuramento) è quando una variabile all'interno di un'area di visibilità nasconde ("oscurando") una variabile con lo stesso nome proveniente da un'area di visibilità esterna. In Go questo è possibile a causa delle peculiarità del blocco di dichiarazione delle variabili :=, specialmente all'interno dei blocchi (if, for, switch, ecc.).
x := 5 if true { x := 10 // Questo x è una nuova variabile, valida solo in questo if fmt.Println(x) // 10 } fmt.Println(x) // 5, non 10
A volte questo può essere utile, ma spesso porta a errori se si dimentica che la variabile ridefinita non è la stessa della variabile esterna.
Domanda: "Cosa stamperà il seguente codice?"
x := 7 if true { x, y := 1, 2 fmt.Println(x, y) } fmt.Println(x)
Risposta:
if verranno dichiarate nuove variabili x e y, disponibili solo nel blocco if.x è sempre la stessa variabile esterna, il cui valore non cambierà.Conclusione:
1 2
7
Storia
Perdita di risorse a causa dello shadowing di err: Un errore tipico è l'oscuramento della variabile di errore durante il lavoro con i file.
f, err := os.Open("file.txt") if err != nil { return err } if err := f.Close(); err != nil { return err } // questa è una nuova variabile err!
L'operatore := crea una nuova variabile err solo all'interno del blocco, mentre la variabile esterna err non cambia. Se si prevede la gestione degli errori nella variabile esterna, questo porta alla perdita di informazioni sugli errori.
Storia
Shadowing di strutture — bug invisibili: All'interno di un blocco annidato, il programmatore ha ridefinito una struttura con lo stesso nome. Di conseguenza, parte della logica lavorava con la versione interna, mentre un'altra con quella esterna, causando strani bug e perdita di dati nel servizio di fatturazione.
Storia
Shadowing nei cicli rompe i conteggi:
In un sistema automatizzato di elaborazione delle richieste, è stato utilizzato := invece di = per incrementare un contatore, causando la creazione di una nuova variabile all'interno del ciclo e il suo incremento, mentre il contatore esterno rimaneva invariato. Il sistema ha sottovalutato le richieste e ha ridotto statistiche importanti.