go

Cómo evitar el molesto error "declarado y no usado" de Golang



(4)

Estoy aprendiendo Golang, pero creo 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 tarde o simplemente descomentar algún comando para probarlo. Siempre obtengo el error y necesito comentar todos esos usos.

¿Hay alguna forma de evitar este tipo de control en Golang?


De acuerdo con las preguntas frecuentes :

Algunos han pedido una opción de compilación para desactivar esos controles o al menos reducirlos a advertencias. Sin embargo, tal 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 corregirlo en el código. (Y si no vale la pena corregirlo, no vale la pena mencionarlo). Segundo, 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 necesariamente estoy de acuerdo con esto por varias razones que no vale la pena abordar. Es lo que es, y no es probable que cambie en el futuro cercano.

Para los paquetes, existe la herramienta goimports que automáticamente agrega paquetes faltantes y elimina los que no se goimports . 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 decente a mitad de camino, por ejemplo para Vim:

:!goimports -w %

La página de goimports enumera algunos comandos para otros editores, y normalmente establece que se ejecute automáticamente cuando guarda el búfer en el disco.

Tenga en cuenta que goimports también ejecutará gofmt .

Como ya se mencionó, para las variables la forma más fácil es asignarlas (temporalmente) a _ :

// No errors your_mother := "was a hamster" your_father := "smells of elderberries" // Commented out for debugging //insult(your_mother, your_father) _, _ = your_mother, your_father


Ese error está aquí para forzarte a escribir un código mejor, y asegúrate de usar todo lo que declaras o importas. Hace que sea más fácil leer el código escrito por otras personas (siempre está seguro de que se usarán todas las variables declaradas) y evitar algún posible código muerto.

Pero, si realmente desea omitir este error, puede usar 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 dice kostix en los comentarios a continuación, puede encontrar la posición oficial del equipo Go en las preguntas frecuentes :

La presencia de una variable no utilizada puede indicar un error, mientras que las importaciones no utilizadas ralentizan la compilación. Acumule suficientes importaciones no utilizadas en el árbol de códigos y las cosas pueden ser muy lentas. Por estas razones, Go no permite ninguno.


Puede usar una simple "función nula" 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, por lo que no tiene que definir la función Use siempre:

import ( "github.com/lunux2008/xulu" ) func main() { // [..] xulu.Use(a, b, c) }


Un ángulo no mencionado hasta ahora es el conjunto de herramientas utilizado para editar el código.

El uso de Visual Studio Code junto con la extensión de lukehoban llamada Go hará algo de auto-magia para ti. La extensión Go ejecuta automáticamente gofmt , golint , etc. y elimina y agrega entradas de import . Entonces al menos esa parte ahora es automática.

Debo admitir que no es el 100% de la solución a la pregunta, pero por muy útil que sea.