Shadowing (sombreado) es cuando una variable en un ámbito interno oculta ("sombra") a una variable con el mismo nombre en un ámbito externo. En Go, esto es posible debido a las particularidades de la declaración de variables con :=, especialmente dentro de bloques (if, for, switch, etc.).
x := 5 if true { x := 10 // Esta x es una nueva variable, solo existe en este if fmt.Println(x) // 10 } fmt.Println(x) // 5, no 10
A veces esto es útil, pero a menudo lleva a errores si se olvida que la variable redeclarada no es la misma que la externa.
Pregunta: "¿Qué imprimirá el siguiente código?"
x := 7 if true { x, y := 1, 2 fmt.Println(x, y) } fmt.Println(x)
Respuesta:
if, se declararán nuevas variables x y y, que solo son accesibles dentro del bloque if.x es la misma variable externa, su valor no cambiará.Conclusión:
1 2
7
Historia
Fugas de recursos por shadowing de err: Un error típico es el sombreado de la variable de error al trabajar con archivos.
f, err := os.Open("file.txt") if err != nil { return err } if err := f.Close(); err != nil { return err } // ¡esta es una nueva variable err!
El operador := crea una nueva variable err solo dentro del bloque, y la variable externa err no cambia. Si se espera el manejo de errores en la variable externa, esto lleva a la pérdida de información sobre errores.
Historia
Shadowing de estructuras — errores invisibles: Dentro de un bloque anidado, el desarrollador redefinió una estructura con el mismo nombre. Como resultado, parte de la lógica trabajaba con la versión interna y otra con la externa, lo que llevó a errores extraños y pérdida de datos en el servicio de facturación.
Historia
Shadowing en bucles rompe los conteos:
En un sistema automatizado de procesamiento de solicitudes, utilizaron := en lugar de = para aumentar el contador, lo que llevó a la creación de una nueva variable dentro del bucle que se incrementaba, mientras que el contador externo permanecía sin cambios. El sistema contaba erróneamente las solicitudes y subestimaba estadísticas importantes.