ProgrammazioneSviluppatore Go

Come funziona lo shadowing (oscuramento delle variabili) in Go? Perché questa caratteristica del linguaggio può portare a errori difficili da individuare durante la programmazione?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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 trabocchetto

Domanda: "Cosa stamperà il seguente codice?"

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

Risposta:

  • All'interno dell'if verranno dichiarate nuove variabili x e y, disponibili solo nel blocco if.
  • All'esterno del blocco, la variabile x è sempre la stessa variabile esterna, il cui valore non cambierà.

Conclusione:

1 2
7

Esempi di errori reali causati dall'ignoranza di questa sfumatura


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.