Cómo evitar el molesto error "declarado y no utilizado"

Resuelto A-letubby asked hace 10 años • 12 respuestas

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?

A-letubby avatar Feb 13 '14 09:02 A-letubby
Aceptado

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.

Florent Bayle avatar Feb 13 '2014 02:02 Florent Bayle

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.

chuacw avatar Jul 17 '2020 09:07 chuacw

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 Usefunción cada vez:

import (
  "github.com/lunux2008/xulu"
)

func main() {
  // [..]

  xulu.Use(a, b, c)
}
lunux2008 avatar Mar 13 '2016 03:03 lunux2008

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 goimportsherramienta 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 goimportspá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 goimportstambié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
Martin Tournoij avatar Mar 27 '2016 14:03 Martin Tournoij