Como desativar o erro de importação não utilizado Golang

96

Por padrão, Go trata a importação não utilizada como erro, forçando você a excluir a importação. Quero saber se existe alguma esperança de mudar esse comportamento, por exemplo, reduzindo-o a aviso.

Acho esse problema extremamente chato, me impedindo de gostar de programar em Go.

Por exemplo, eu estava testando algum código, desativando um segmento / função. Algumas funções de um lib não são mais usadas (por exemplo, fmt, erros, qualquer coisa), mas vou precisar reativar a função após alguns testes. Agora, o programa não compilará a menos que eu remova essas importações e, alguns minutos depois, preciso reimportar a lib.

Eu estava fazendo esse processo repetidamente ao desenvolver um programa GAE.

usuario
fonte
1
Não é uma boa ideia deixar as importações não utilizadas em seu código, mas você pode apenas comentá-las temporariamente.
elithrar
70
Concordo que não é uma boa ideia deixar as importações não utilizadas, mas é uma má ideia desperdiçar desnecessariamente o esforço do programador para fazer coisas como esta, especialmente isto está ocorrendo com frequência ao testar algo. Esses votos negativos devem ser pela minha atitude em relação aos fãs de Go.
Nick
6
É um recurso, não um bug .
beatgammit
1
Remover as importações não utilizadas é uma coisa boa. Existem muitos guias de estilo que exigem que todos os avisos sejam tratados como erros, portanto, adicionar um novo aviso geralmente é uma má ideia. Talvez um sinalizador -dev possa ser um possível meio-termo, mas var _ = <module>.Functionfunciona bem e é visível o suficiente para evitar que seja uma prática comum.
deft_code
1
Como alguém está tocando nas respostas abaixo, eu recomendo usar um IDE que gerencie importações (Gogland, LiteIDE, etc. - existem vários), ou ter goimportscomo uma etapa em seu processo de construção. Sem qualquer um deles, envelhece muito rápido.
Josef Grahn

Respostas:

36

Adicionar um sublinhado ( _) antes de um nome de pacote irá ignorar o erro de importação não utilizado.

Aqui está um exemplo de como você pode usá-lo:

import (
    "log"
    "database/sql"

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

Para importar um pacote apenas para seus efeitos colaterais (inicialização), use o identificador em branco como nome explícito do pacote.

Veja mais em https://golang.org/ref/spec#Import_declarations

Ácido9
fonte
Essa é a resposta correta. Com base na especificação GoLang Doc, destina-se a ser usado para importar um pacote apenas para efeitos colaterais (inicialização). GoLang Spec Doc aqui: golang.org/ref/spec#Import_declarations
Will
Simplesmente fantástico. Isso deve estar em uma lista das dez principais coisas que os desenvolvedores de golang devem saber. Obrigado!
JM Janzen
9
Não é muito útil. O problema com isso é que, se você quiser usar a importação novamente, você deve remover o _(caso contrário, o pacote não pode ser referenciado, pois não tem nome). Se você vai fazer isso, você pode apenas comentar / descomentar. O var _ = ...truque não tem esse problema.
EM0 de
Se você adicionar o sublinhado "fmt"no Gogland, ele adicionará automaticamente "fmt"para que você tenha ambos _"fmt"e "fmt", o que o torna inútil neste IDE
kramer65
26

O var _ = fmt.Printftruque é útil aqui.

Volker
fonte
Eu amo essa solução. É feio o suficiente para torná-lo indesejável, mas funciona e está lá se você realmente precisar.
deft_code
3
Para obter mais detalhes, verifique este link tip.golang.org/doc/effective_go.html#blank_unused
Deepak Singh Rawat
3
É útil no momento, mas quando usei essa técnica, tendia a não voltar e excluir o identificador em branco não usado mais tarde, fazendo com que as importações permanecessem quando eu realmente não pretendia usá-las a longo prazo. Usar uma ferramenta como o goimports resolveu o problema real e garante que minhas importações sejam sempre mínimas e limpas.
mdwhatcott
Ainda um hack estúpido na minha opinião, embora provavelmente a coisa mais eficiente a se fazer.
Anthony
+1 porque isso pode ser feito em qualquer lugar no arquivo , o que normalmente seria uma ideia horrível, mas é realmente útil para evitar que você tenha que pular o arquivo para chegar à importinstrução e voltar quando você está apenas tentando compilar ou testar algum arquivo de código que você está desenvolvendo iterativamente .
mtraceur
21

Eu tenho o mesmo problema. Eu entendo o motivo pelo qual eles implementaram a linguagem para proibir importações e variáveis ​​não utilizadas, mas pessoalmente acho esse recurso irritante ao escrever meu código. Para contornar isso, mudei meu compilador para permitir sinalizadores opcionais para permitir variáveis ​​não utilizadas e importações em meu código.

Se estiver interessado, você pode ver isso em https://github.com/dtnewman/modified_golang_compiler .

Agora, posso simplesmente executar o código com um comando como go run -gcflags '-unused_pkgs' test.go e ele não gerará esses erros de "importação não utilizada". Se eu deixar de fora essas sinalizações, ele retorna ao padrão de não permitir importações não utilizadas.

Fazer isso exigiu apenas algumas mudanças simples. Os puristas do Go provavelmente não ficarão felizes com essas mudanças, pois há um bom motivo para não permitir variáveis ​​/ importações não utilizadas, mas eu pessoalmente concordo com você que esse problema torna muito menos agradável codificar no Go, e é por isso que fiz essas alterações no meu compilador.

dtzvi
fonte
2
Eu também fiz o mesmo com a versão 1.6, verifique aqui se estiver interessado: github.com/ronelliott/go/tree/release-branch.go1.6 OBSERVAÇÃO: alguns testes falharão
Ron E
2
Eu amo a ideia por trás disso. Vejo que seu fork ainda está na versão 1.2, o que o torna inútil. Isso deve ser incluído no compilador go padrão, pelo menos para go run main.godesabilitar os erros por padrão, enquanto go buildhabilita os erros. Dessa forma, é fácil desenvolver usando go rune, quando é hora de construir para produção, você ainda é forçado a limpar seu código.
Kramer65,
17

Use goimports . É basicamente um fork do gofmt, escrito por Brad Fitzpatrick e agora incluído nos pacotes de ferramentas go. Você pode configurar seu editor para executá-lo sempre que salvar um arquivo. Você nunca mais terá que se preocupar com esse problema.

mdwhatcott
fonte
5

Se você estiver usando o fmtpacote para impressão geral para o console enquanto desenvolve e testa, você pode encontrar uma solução melhor no pacote de log .

OldCurmudgeon
fonte
5
Ou a função embutida printlnque as pessoas sempre parecem esquecer.
MatrixFrog
2
@MatrixFrog No longo prazo, não é uma boa ideia desenvolver essas funções, pois elas podem desaparecer com o tempo. É uma boa ideia usar o log, pois você pode mantê-lo e ele faz parte da biblioteca padrão e provavelmente não será removido. Veja as especificações para detalhes.
nemo
1
Embutido println?? Isso é novidade para mim. É não documentado? Não consigo encontrar em lugar nenhum.
Matt
1
@nemo bom ponto. Eles são perfeitos para quando você precisa imprimir algo rapidamente, mas não pretende fazer o check-in. Provavelmente não é bom usá-los em qualquer outro caso.
MatrixFrog
1
@MartinTournoij - Eu discordo. Esta foi a solução que finalmente encontrei quando tive esse problema 5 anos atrás e com mais de 5 votos a favor, ele claramente ajudou outras pessoas. Eu era um novato usando o fmtpacote para registro, sem saber que havia um pacote de registro pronto.
OldCurmudgeon
5

Use if false { ... }para comentar algum código. O código entre colchetes deve ser sintaticamente correto, mas pode ser um código sem sentido de outra forma.

pular
fonte
3
Mais do que sintaticamente correto, todas as variáveis ​​referenciadas (por exemplo, foo.Bar) devem existir, etc.
Dragon
Isso não é muito claro ou idiomático. Há uma razão pela qual Go foi projetado da maneira que era
Acidic9
1
Esta é uma boa técnica quando alguém está simplesmente testando coisas enquanto desenvolve um script ou explora APIs em Golang. Obrigado topskip!
Jay Taylor
2

Muitas pessoas já comentaram com justificativas válidas e também reconheço a intenção do autor original. No entanto, Rob Pike mencionou em diferentes fóruns que Go é o resultado da simplificação dos processos que algumas outras linguagens de programação convencionais não têm ou não são fáceis de alcançar. É a semântica da linguagem Go, além de tornar a compilação mais rápida, há uma série de coisas que são adotadas que inicialmente parecem ineficientes.

Para resumir, as importações não utilizadas são consideradas erros no Go, pois isso mata o programa e torna a compilação mais lenta. Usar importação para efeito colateral (_) é uma solução alternativa, no entanto, acho isso confuso às vezes quando há uma mistura de importações válidas com efeitos colaterais junto com efeitos colaterais importados exclusivamente para fins de depuração / teste, especialmente quando a base de código é grande e há uma chance de esquecer e não excluir acidentalmente, o que pode confundir outros engenheiros / revisores posteriormente. Eu costumava comentar os não usados, no entanto, IDEs populares como o código VS e Goland podem usar goimportsfacilmente, o que faz a inserção e exclusão de importações muito bem. Consulte o link para obter mais informações, https://golang.org/doc/effective_go.html#blank_import

sbcharr
fonte
Obrigado por isso! Eu sugiro copiar e colar explicitamente a linha de código do URL que você postou em sua resposta como um exemplo concreto de importação para efeito colateral: import _ "net/http/pprof"
Dragon
1
Obrigado @Dragon pela sua sugestão! Como sou um novo colaborador, com a ajuda de pessoas como você, vou melhorar minhas postagens rapidamente.
sbcharr
-1

coloque isso no topo do seu documento e esqueça as importações não utilizadas:

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

var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs
goen
fonte
1
Em vez de fazer o compilador gerar código morto se você realmente quiser fazer isso, use _variáveis ​​globais (por exemplo, um pacote por linha ou se você insistir, todos juntos como var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs:). Mas não faça isso, apenas use goimports.
Dave C