Cómo deshabilitar el error de importación no utilizado de Golang

98

De forma predeterminada, Go trata la importación no utilizada como un error, lo que le obliga a eliminar la importación. Quiero saber si existe alguna esperanza de cambiar este comportamiento, por ejemplo, reducirlo a una advertencia.

Este problema me resulta extremadamente molesto, lo que me impide disfrutar de la codificación en Go.

Por ejemplo, estaba probando un código, deshabilitando un segmento / función. Algunas funciones de una biblioteca ya no se usan (por ejemplo, fmt, errores, lo que sea), pero necesitaré volver a habilitar la función después de algunas pruebas. Ahora el programa no se compilará a menos que elimine esas importaciones, y unos minutos más tarde necesito volver a importar la lib.

Estaba haciendo este proceso una y otra vez cuando desarrollaba un programa GAE.

Mella
fuente
1
No es una buena idea dejar importaciones sin usar en su código, pero puede comentarlas temporalmente.
elithrar
72
Estoy de acuerdo en que no es una buena idea dejar importaciones sin usar, pero es una mala idea desperdiciar innecesariamente el esfuerzo del programador para hacer cosas como esta, especialmente esto ocurre muy a menudo cuando se prueba algo. Los votos negativos deben ser por mi actitud de GO por esos fanáticos de Go.
Nick
6
Es una característica, no un error .
beatgammit
1
Eliminar las importaciones no utilizadas es algo bueno. Hay muchas guías de estilo que requieren que todas las advertencias se traten como errores, por lo que agregar una nueva advertencia generalmente es una mala idea. Quizás un indicador -dev podría ser un posible compromiso, pero var _ = <module>.Functionfunciona bien y es lo suficientemente llamativo como para evitar que sea una práctica común.
deft_code
1
Como alguien está tocando en las respuestas a continuación, recomiendo usar un IDE que administre las importaciones (Gogland, LiteIDE, etc., hay varios), o tener goimportscomo paso en su proceso de compilación. Sin ninguno de ellos, envejece muy rápido.
Josef Grahn

Respuestas:

37

Agregar un guión bajo ( _) antes del nombre de un paquete ignorará el error de importación no utilizado.

Aquí hay un ejemplo de cómo podría usarlo:

import (
    "log"
    "database/sql"

    _ "github.com/go-sql-driver/mysql"
)

Para importar un paquete únicamente por sus efectos secundarios (inicialización), use el identificador en blanco como nombre explícito del paquete.

Ver más en https://golang.org/ref/spec#Import_declarations

Ácido9
fuente
Esta es la respuesta correcta. Basado en el documento de especificación de GoLang, está destinado a ser utilizado para importar un paquete únicamente para efectos secundarios (inicialización). GoLang Spec Doc aquí: golang.org/ref/spec#Import_declarations
Will el
Simplemente fantastico. Esto debería estar en una lista de las diez cosas principales que los desarrolladores nuevos en golang deberían saber. ¡Gracias!
JM Janzen
11
No es muy útil. El problema con esto es que si luego desea utilizar la importación nuevamente, debe eliminar el _(de lo contrario, no se puede hacer referencia al paquete, ya que no tiene nombre). Si vas a hacer eso, también puedes comentarlo / descomentarlo. El var _ = ...truco no tiene este problema.
EM0
Si agrega el guión bajo "fmt"en Gogland, se agrega automáticamente "fmt"para que tenga ambos _"fmt"y "fmt", lo que lo hace inútil en este IDE
kramer65
26

El var _ = fmt.Printftruco es útil aquí.

Volker
fuente
Amo esta solucion Es lo suficientemente feo como para hacerlo indeseable, pero funciona, así que está ahí si realmente lo necesitas.
deft_code
3
Para obtener más detalles, consulte este enlace tip.golang.org/doc/effective_go.html#blank_unused
Deepak Singh Rawat
3
Es útil en este momento, pero cuando usé esta técnica, tendía a no volver atrás y eliminar el identificador en blanco no usado más tarde, lo que hacía que las importaciones se quedaran cuando realmente no tenía la intención de usarlas a largo plazo. El uso de una herramienta como goimports ha resuelto el problema real y garantiza que mis importaciones sean siempre mínimas y limpias.
mdwhatcott
Sigue siendo un truco estúpido en mi opinión, aunque probablemente sea lo más eficiente que se puede hacer.
Anthony
+1 porque esto se puede hacer en cualquier parte del archivo , lo que normalmente sería una idea terrible, pero es realmente útil para evitar tener que saltar por el archivo para llegar a la importdeclaración y regresar cuando solo está tratando de compilar o probar algún archivo de código que está desarrollando iterativamente .
mtraceur
22

Tengo el mismo problema. Entiendo el razonamiento de por qué implementaron el lenguaje para no permitir las importaciones y variables no utilizadas, pero personalmente encuentro esta característica molesta al escribir mi código. Para evitar esto, cambié mi compilador para permitir indicadores opcionales para permitir variables e importaciones no utilizadas en mi código.

Si está interesado, puede verlo en https://github.com/dtnewman/modified_golang_compiler .

Ahora, puedo simplemente ejecutar código con un comando como go run -gcflags '-unused_pkgs' test.go y no arrojará estos errores de "importación no utilizada". Si omito estos indicadores, vuelve al valor predeterminado de no permitir importaciones no utilizadas.

Hacer esto solo requirió unos pocos cambios simples. Los puristas de Go probablemente no estarán contentos con estos cambios, ya que hay una buena razón para no permitir las variables / importaciones no utilizadas, pero personalmente estoy de acuerdo con usted en que este problema hace que sea mucho menos agradable codificar en Go, por lo que hice estos cambios en mi compilador.

dtzvi
fuente
2
También he hecho lo mismo con la versión 1.6, marque aquí si está interesado: github.com/ronelliott/go/tree/release-branch.go1.6 NOTA: algunas pruebas fallarán
Ron E
2
Amo la idea detrás de esto. Sin embargo, veo que tu fork todavía está en la versión 1.2, lo que lo hace inútil. Esto debe incluirse en el compilador estándar de go, al menos para que go run main.godeshabilite los errores de forma predeterminada, mientras go buildque los habilita. De esa manera, es fácil de desarrollar usando go runy cuando llega el momento de construir para producción, todavía se ve obligado a limpiar su código.
kramer65
17

Utilice goimports . Es básicamente una bifurcación de gofmt, escrita por Brad Fitzpatrick y ahora incluida en los paquetes de herramientas de Go. Puede configurar su editor para ejecutarlo siempre que guarde un archivo. Nunca más tendrás que preocuparte por este problema.

mdwhatcott
fuente
5

Si está utilizando el fmtpaquete para la impresión general en la consola mientras desarrolla y prueba, puede encontrar una mejor solución en el paquete de registro .

ViejoCurmudgeon
fuente
5
O la función incorporada printlnque la gente siempre parece olvidar.
MatrixFrog
2
@MatrixFrog A largo plazo, no es una buena idea desarrollar estas funciones, ya que pueden desaparecer con el tiempo. El uso de log es una buena idea, ya que puede conservarlos y es parte de la biblioteca estándar y es poco probable que se elimine. Consulte las especificaciones para obtener más detalles.
nemo
1
Incorporado println?? Esto es nuevo para mí. ¿Es indocumentado? No puedo encontrarlo por ninguna parte.
Matt
1
@nemo buen punto. Son perfectos para cuando necesita imprimir algo de forma rápida y única, pero no tiene la intención de registrarlo. Probablemente no sea bueno usarlos en cualquier otro caso.
MatrixFrog
1
@MartinTournoij - No estoy de acuerdo. Esta fue la solución que finalmente encontré cuando tuve este problema hace 5 años y con más de 5 votos a favor, claramente ha ayudado a otros. Era un novato que usaba el fmtpaquete para el registro, sin saber que había un paquete de registro listo para usar .
OldCurmudgeon
5

Úselo if false { ... }para comentar algún código. El código entre llaves debe ser sintácticamente correcto, pero de lo contrario puede ser un código sin sentido.

topskip
fuente
3
Más que sintácticamente correcto, cualquier variable referenciada (por ejemplo, foo.Bar) debe existir, etc.
Dragon
Esto no es muy limpio ni idiomático. Hay una razón por la que Go fue diseñado de la manera en que fue
Acidic9
1
Esta es una buena técnica cuando uno simplemente está probando cosas mientras desarrolla un script o explora API en Golang. ¡Gracias topskip!
Jay Taylor
2

Mucha gente ya ha comentado con justificación válida y también reconozco la intención del autor original. Sin embargo, Rob Pike mencionó en diferentes foros que Go es el resultado de la simplificación de los procesos que algunos otros lenguajes de programación convencionales carecen o no son fáciles de lograr. Es la semántica del lenguaje de Go, además de hacer la compilación más rápida, hay muchas cosas que se adoptan que inicialmente parecen ineficientes.

Para abreviar, las importaciones no utilizadas se consideran errores en Go, ya que borra el programa y ralentiza la compilación. Usar la importación para efectos secundarios (_) es una solución alternativa, sin embargo, encuentro esto confuso en ocasiones cuando hay una combinación de importaciones válidas con efectos secundarios junto con efectos secundarios importados únicamente con el propósito de depurar / probar, especialmente cuando la base del código es grande y existe la posibilidad de olvidar y no eliminar involuntariamente, lo que puede confundir a otros ingenieros / revisores más adelante. Solía ​​comentar los no utilizados, sin embargo, los IDE populares como el código VS y Goland se pueden usar goimportsfácilmente, lo que hace que la inserción y eliminación de las importaciones sea bastante buena. Consulte el enlace para obtener más información, https://golang.org/doc/effective_go.html#blank_import

sbcharr
fuente
¡Gracias por esto! Sugeriría copiar y pegar explícitamente la línea de código de la URL que publicó en su respuesta como un ejemplo concreto de importación para efectos secundarios: import _ "net/http/pprof"
Dragon
1
¡Gracias @Dragon por tu sugerencia! Como soy un colaborador nuevo, con la ayuda de personas como tú, mejoraré rápidamente mis publicaciones.
sbcharr
-1

ponga esto en la parte superior de su documento y olvídese de las importaciones no utilizadas:

import (
    "bufio"
    "fmt"
    "os"
    "path/filepath"
)

var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs
goen
fuente
1
En lugar de hacer que el compilador genere código muerto si realmente desea hacer esto, use _variables globales en su lugar (por ejemplo, un paquete por línea o si insiste, todos juntos como :) var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs. Pero no hagas esto, solo usa goimports.
Dave C