Cómo evitar el molesto error "declarado y no utilizado"
Estoy aprendiendo Go pero siento que es un poco molesto que al compilar no deje ninguna variable o paquete sin usar.
Esto realmente me está frenando bastante. Por ejemplo, solo quería declarar un nuevo paquete y planear usarlo más adelante o simplemente descomentar algún comando para probar. Siempre recibo el error y necesito comentar todos esos usos.
¿Hay alguna forma de evitar este tipo de control en Go?
Ese error está aquí para obligarte a escribir un mejor código y asegurarte de usar todo lo que declaras o importas. Facilita la lectura del código escrito por otras personas (siempre está seguro de que se utilizarán todas las variables declaradas) y evita algún posible código muerto.
Pero, si realmente desea evitar este error, puede utilizar el identificador en blanco ( _
):
package main
import (
"fmt" // imported and not used: "fmt"
)
func main() {
i := 1 // i declared and not used
}
se convierte
package main
import (
_ "fmt" // no more error
)
func main() {
i := 1 // no more error
_ = i
}
Como dijo kostix en los comentarios a continuación, puede encontrar la posición oficial del equipo de Go en las preguntas frecuentes :
La presencia de una variable no utilizada puede indicar un error, mientras que las importaciones no utilizadas simplemente ralentizan la compilación. Acumule suficientes importaciones no utilizadas en su árbol de código y las cosas pueden volverse muy lentas. Por estos motivos, Go no permite ninguna de las dos cosas.
Me encontré con esto mientras estaba aprendiendo Go hace 2 años, así que declaré mi propia función.
// UNUSED allows unused variables to be included in Go programs
func UNUSED(x ...interface{}) {}
Y luego puedes usarlo así:
UNUSED(x)
UNUSED(x, y)
UNUSED(x, y, z)
Lo mejor de esto es que puedes pasar cualquier cosa a NO UTILIZADO.
¿Es mejor que el siguiente?
_, _, _ = x, y, z
Eso depende de usted.
Puede utilizar una "función nula" simple para esto, por ejemplo:
func Use(vals ...interface{}) {
for _, val := range vals {
_ = val
}
}
Que puedes usar así:
package main
func main() {
a := "declared and not used"
b := "another declared and not used"
c := 123
Use(a, b, c)
}
También hay un paquete para esto para que no tengas que definir la Use
función cada vez:
import (
"github.com/lunux2008/xulu"
)
func main() {
// [..]
xulu.Use(a, b, c)
}
Según las preguntas frecuentes :
Algunos han pedido una opción de compilación para desactivar esas comprobaciones o al menos reducirlas a advertencias. Sin embargo, dicha opción no se ha agregado porque las opciones del compilador no deberían afectar la semántica del lenguaje y porque el compilador Go no informa advertencias, solo errores que impiden la compilación.
Hay dos razones para no tener advertencias. Primero, si vale la pena quejarse, vale la pena arreglarlo en el código. (Y si no vale la pena arreglarlo, no vale la pena mencionarlo). En segundo lugar, hacer que el compilador genere advertencias alienta a la implementación a advertir sobre casos débiles que pueden hacer que la compilación sea ruidosa, enmascarando errores reales que deberían corregirse.
No estoy necesariamente de acuerdo con esto por varias razones que no vale la pena explicar. Es lo que es y no es probable que cambie en un futuro próximo.
Para los paquetes, existe la goimports
herramienta que agrega automáticamente los paquetes faltantes y elimina los no utilizados. Por ejemplo:
# Install it
$ go get golang.org/x/tools/cmd/goimports
# -w to write the source file instead of stdout
$ goimports -w my_file.go
Deberías poder ejecutar esto desde cualquier editor medianamente decente, por ejemplo para Vim:
:!goimports -w %
La goimports
página enumera algunos comandos para otros editores y, por lo general, la configura para que se ejecute automáticamente cuando guarda el búfer en el disco.
Tenga en cuenta que goimports
también se ejecutará gofmt
.
Como ya se mencionó, para las variables la forma más sencilla es asignarlas (temporalmente) a _
:
// No errors
tasty := "ice cream"
horrible := "marmite"
// Commented out for debugging
//eat(tasty, horrible)
_, _ = tasty, horrible