El identificador en blanco (_) es un identificador especial en Go que se utiliza para ignorar valores. Se usa cuando el valor devuelto por una función no es necesario, al importar paquetes solo para llamar a su init o al implementar interfaces.
Ejemplos:
// Ignoramos el valor devuelto del error data, _ := ioutil.ReadFile("file.txt") // Importar un paquete solo por efectos secundarios import _ "net/http/pprof"
Además, el identificador en blanco ayuda al implementar una interfaz sin necesitar usar explícitamente todos los métodos:
var _ io.Reader = (*MyReader)(nil) // la compilación fallará si el tipo no implementa la interfaz
¿Se puede usar el identificador en blanco para suprimir errores de forma permanente? ¿Es una práctica segura?
Respuesta: No. Aunque el identificador en blanco permite ignorar un error, no es una práctica segura; suprimir errores a menudo lleva a fallos fatales o al mal funcionamiento del programa. Siempre se deben manejar los errores de manera consciente y solo en lugares claros (por ejemplo, usar el identificador en blanco para suprimir errores que son claramente insignificantes para la lógica).
Historia
En una aplicación para trabajar con archivos, el desarrollador utilizó en todas partes la construcción _, _ = file.Write(...), ignorando los errores de escritura. Como resultado, al llenarse el disco o fallar la escritura, el programa continuó funcionando 'como si todo estuviera bien', lo que llevó a la pérdida de datos.
Historia
En un proyecto de auditoría, el auditor pensaba que si una función devuelve un error, siempre se debe suprimir (_). Debido a esto, no se detectaron errores al registrar las acciones durante las pruebas, lo que llevó a la pérdida de datos importantes y no se entendió la razón.
Historia
Un estudiante, al aprender Go, utilizó el identificador en blanco al importar varios paquetes de terceros, aunque no era necesario. Como resultado, el tamaño del archivo binario aumentó casi al doble, ya que todos los efectos secundarios de los paquetes se incluyeron en la aplicación final.