Come disabilitare l'errore di importazione inutilizzato di Golang


96

Per impostazione predefinita, Go considera l'importazione inutilizzata come un errore, costringendoti a eliminare l'importazione. Voglio sapere se esiste qualche speranza di cambiare questo comportamento, ad esempio riducendolo ad avvertimento.

Trovo questo problema estremamente fastidioso, impedendomi di divertirmi con la programmazione in Go.

Ad esempio, stavo testando un codice, disabilitando un segmento / funzione. Alcune funzioni da una lib non sono più utilizzate (ad esempio fmt, errori, qualunque cosa), ma dovrò riattivare la funzione dopo un po 'di test. Ora il programma non si compila a meno che non rimuova quelle importazioni e pochi minuti dopo devo reimportare la lib.

Stavo ripetendo questo processo durante lo sviluppo di un programma GAE.


1
Non è una buona idea lasciare le importazioni inutilizzate nel codice, ma puoi semplicemente commentarle temporaneamente.
elithrar

70
Sono d'accordo che non è una buona idea lasciare le importazioni inutilizzate, ma è una cattiva idea sprecare inutilmente lo sforzo del programmatore per fare cose come questa, specialmente questo si verifica molto spesso quando si prova qualcosa. I voti negativi devono essere per il mio atteggiamento nei confronti del GO da parte di quei fan di Go.
Nick

6
È una caratteristica, non un bug .
beatgammit

1
La rimozione delle importazioni inutilizzate è una buona cosa. Esistono molte guide di stile che richiedono che tutti gli avvisi vengano trattati come errori, quindi aggiungere un nuovo avviso è generalmente una cattiva idea. Forse un flag -dev potrebbe essere un possibile compromesso, ma var _ = <module>.Functionfunziona bene ed è abbastanza evidente da impedire che sia una pratica comune.
deft_code

1
Dato che qualcuno sta toccando le risposte seguenti, consiglio di utilizzare un IDE che gestisca le importazioni (Gogland, LiteIDE, ecc. - Ce ne sono diversi) o di avere goimportscome passaggio nel processo di creazione. Senza nessuno di questi invecchia molto velocemente.
Josef Grahn

Risposte:


36

L'aggiunta di un trattino basso ( _) prima del nome di un pacchetto ignorerà l'errore di importazione inutilizzato.

Ecco un esempio di come potresti usarlo:

import (
    "log"
    "database/sql"

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

Per importare un pacchetto esclusivamente per i suoi effetti collaterali (inizializzazione), utilizzare l'identificatore vuoto come nome esplicito del pacchetto.

Visualizza altro su https://golang.org/ref/spec#Import_declarations


Questa è la risposta corretta. In base alla specifica GoLang Doc, è concepito per essere utilizzato per importare un pacchetto esclusivamente per gli effetti collaterali (inizializzazione). GoLang Spec Doc qui: golang.org/ref/spec#Import_declarations
Will

Semplicemente fantastico. Questo dovrebbe essere in una lista delle prime dieci cose che i nuovi sviluppatori di Golang dovrebbero sapere. Grazie!
JM Janzen

9
Non molto utile. Il problema con questo è che se in seguito si desidera utilizzare di nuovo l'importazione, è necessario rimuovere il _(altrimenti non è possibile fare riferimento al pacchetto, poiché non ha nome). Se hai intenzione di farlo, potresti anche commentarlo / rimuoverlo. Il var _ = ...trucco non ha questo problema.
EM0

Se aggiungi il carattere di sottolineatura a "fmt"in Gogland, viene aggiunto automaticamente in "fmt"modo da avere sia _"fmt"e "fmt", il che lo rende inutile in questo IDE
kramer65

26

Il var _ = fmt.Printftrucco è utile qui.


Amo questa soluzione. È abbastanza brutto da renderlo indesiderabile, ma funziona quindi è lì se ne hai davvero bisogno.
deft_code

3
Per maggiori dettagli, controlla questo link tip.golang.org/doc/effective_go.html#blank_unused
Deepak Singh Rawat

3
È utile in questo momento, ma quando ho usato questa tecnica tendevo a non tornare indietro ed eliminare l'identificatore vuoto inutilizzato in seguito, facendo sì che le importazioni rimanessero in giro quando non avevo intenzione di usarle a lungo termine. L'utilizzo di uno strumento come goimports ha risolto il vero problema e garantisce che le mie importazioni siano sempre minime e pulite.
mdwhatcott

Ancora uno stupido hack secondo me, anche se probabilmente la cosa più efficiente da fare.
Anthony

+1 perché questo può essere fatto ovunque nel file , che normalmente sarebbe un'idea orribile ma è davvero utile per evitarti di dover saltare il file per arrivare importall'istruzione e viceversa quando stai solo cercando di compilare o testare un file di codice che stai elaborando in modo iterativo .
mtraceur

21

Ho lo stesso problema. Capisco il motivo per cui hanno implementato il linguaggio per non consentire importazioni e variabili inutilizzate, ma personalmente trovo questa funzionalità fastidiosa durante la scrittura del mio codice. Per aggirare questo problema, ho modificato il mio compilatore per consentire flag opzionali per consentire le variabili e le importazioni inutilizzate nel mio codice.

Se sei interessato, puoi vederlo su https://github.com/dtnewman/modified_golang_compiler .

Ora posso semplicemente eseguire il codice con un comando come go run -gcflags '-unused_pkgs' test.go e non genererà questi errori di "importazione inutilizzata". Se tralascio questi flag, torna all'impostazione predefinita di non consentire importazioni inutilizzate.

Questa operazione richiedeva solo alcune semplici modifiche. I puristi di Go probabilmente non saranno contenti di queste modifiche poiché ci sono buone ragioni per non consentire variabili / importazioni inutilizzate, ma personalmente sono d'accordo con te sul fatto che questo problema rende molto meno divertente il codice in Go, motivo per cui ho apportato queste modifiche al mio compilatore.


2
Ho fatto lo stesso anche con la versione 1.6, controlla qui se interessato: github.com/ronelliott/go/tree/release-branch.go1.6 NOTA: alcuni test falliranno
Ron E

2
Amo l'idea alla base di questo. Vedo che il tuo fork è ancora alla versione 1.2, il che lo rende inutile. Questo dovrebbe essere incluso nel compilatore go standard, almeno in modo che go run main.godisabiliti gli errori di default, mentre go buildabiliti gli errori. In questo modo è facile sviluppare utilizzando go rune quando è il momento di creare per la produzione, sei comunque costretto a ripulire il tuo codice.
kramer65

17

Usa goimports . È fondamentalmente un fork di gofmt, scritto da Brad Fitzpatrick e ora incluso nei pacchetti go tools. Puoi configurare il tuo editor per eseguirlo ogni volta che salvi un file. Non dovrai mai più preoccuparti di questo problema.


5

Se stai utilizzando il fmtpacchetto per la stampa generale su console mentre sviluppi e collaudi, potresti trovare una soluzione migliore nel pacchetto di log .


5
O la funzione incorporata printlnche le persone sembrano sempre dimenticare.
MatrixFrog

2
@MatrixFrog A lungo termine, non è una buona idea costruire su queste funzioni in quanto potrebbero svanire nel tempo. Usare i log è una buona idea in quanto potresti tenerli ed è parte della libreria standard ed è improbabile che venga rimosso. Vedere le specifiche per i dettagli.
nemo

1
Builtin println?? Questa è una novità per me. Non è documentato? Non riesco a trovarlo da nessuna parte.
Matt

1
@nemo buon punto. Sono perfetti per quando devi stampare qualcosa come una tantum veloce, ma non intendi effettivamente registrarlo. Probabilmente non va bene usarli in altri casi.
MatrixFrog

1
@MartinTournoij - Non sono d'accordo. Questa è stata la soluzione che alla fine ho trovato quando ho avuto questo problema 5 anni fa e con 5+ voti ha chiaramente aiutato gli altri. Ero un principiante che utilizzava il fmtpacchetto per la registrazione, ignaro che esistesse un pacchetto di registrazione già pronto.
OldCurmudgeon

5

Utilizzare if false { ... }per commentare un codice. Il codice all'interno delle parentesi graffe deve essere sintatticamente corretto, altrimenti può essere un codice senza senso.


3
Più che sintatticamente corretto, tutte le variabili referenziate (ad esempio foo.Bar) devono esistere, ecc.
Dragon

Questo non è molto pulito o idiomatico. C'è un motivo per cui Go è stato progettato come era
Acidic9

1
Questa è una tecnica piacevole quando si stanno semplicemente provando delle cose mentre si sviluppa uno script o si esplorano le API in Golang. Grazie topskip!
Jay Taylor

2

Molte persone hanno già commentato con valida giustificazione e riconosco anche l'intenzione dell'autore originale. Tuttavia, Rob Pike ha menzionato in diversi forum che Go è il risultato di una semplificazione dei processi che alcuni altri linguaggi di programmazione tradizionali mancano o non sono facili da ottenere. È la semantica del linguaggio di Go oltre che per rendere la compilazione più veloce, ci sono molte cose che vengono adottate che inizialmente sembrano inefficienti.

Per farla breve, le importazioni inutilizzate sono considerate errori in Go poiché cancella il programma e rallenta la compilazione. L'uso dell'importazione per l'effetto collaterale (_) è una soluzione alternativa, tuttavia, trovo questo confuso nei momenti in cui c'è un mix di importazioni valide con effetti collaterali insieme a effetti collaterali importati esclusivamente a scopo di debug / test, specialmente quando la base del codice è grande e c'è la possibilità di dimenticare e non eliminare involontariamente, il che potrebbe confondere altri ingegneri / revisori in seguito. Ero solito commentare quelli inutilizzati, tuttavia, gli IDE popolari come VS code e Goland possono essere usati goimportsfacilmente, il che fa l'inserimento e la cancellazione delle importazioni abbastanza bene. Fare riferimento al collegamento per maggiori informazioni, https://golang.org/doc/effective_go.html#blank_import


Grazie per questo! Suggerirei di copiare e incollare esplicitamente la riga di codice dall'URL che hai pubblicato nella tua risposta come esempio concreto di importazione per effetto collaterale: import _ "net/http/pprof"
Dragon

1
Grazie @Dragon per il tuo suggerimento! Dato che sono un nuovo collaboratore, con l'aiuto di persone come te, migliorerò rapidamente con i miei post.
sbcharr

-1

mettilo in cima al tuo documento e dimentica le importazioni inutilizzate:

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

var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs

1
Invece di fare in modo che il compilatore generi codice morto, se lo desideri veramente, usa _invece le variabili globali (es. Un pacchetto per riga o, se insisti, tutte insieme come :) var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs. Ma non farlo, usa e basta goimports.
Dave C
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.