So deaktivieren Sie den nicht verwendeten Golang-Importfehler


96

Standardmäßig behandelt Go nicht verwendeten Import als Fehler und zwingt Sie, den Import zu löschen. Ich möchte wissen, ob es Hoffnung gibt, dieses Verhalten zu ändern, z. B. es auf Warnung zu reduzieren.

Ich finde dieses Problem äußerst ärgerlich und hindere mich daran, das Codieren in Go zu genießen.

Zum Beispiel habe ich Code getestet und ein Segment / eine Funktion deaktiviert. Einige Funktionen aus einer Bibliothek werden nicht mehr verwendet (z. B. fmt, Fehler usw.), aber ich muss die Funktion nach einigem Testen wieder aktivieren. Jetzt wird das Programm erst kompiliert, wenn ich diese Importe entferne, und einige Minuten später muss ich die Bibliothek erneut importieren.

Ich habe diesen Prozess immer wieder gemacht, als ich ein GAE-Programm entwickelt habe.


1
Es ist keine gute Idee, nicht verwendete Importe in Ihrem Code zu belassen, aber Sie können sie nur vorübergehend auskommentieren.
Elithrar

70
Ich bin damit einverstanden, dass es keine gute Idee ist, nicht verwendete Importe zu belassen, aber es ist eine schlechte Idee, die Anstrengungen des Programmierers unnötig zu verschwenden, um solche Dinge zu tun, insbesondere wenn dies beim Testen von etwas sehr häufig vorkommt. Diese Abstimmungen müssen für meine Einstellung zu GO durch diese Go-Fans sein.
Nick

6
Es ist eine Funktion, kein Fehler .
Beatgammit

1
Nicht verwendete Importe zu entfernen ist eine gute Sache. Es gibt viele Styleguides, bei denen alle Warnungen als Fehler behandelt werden müssen. Daher ist das Hinzufügen einer neuen Warnung im Allgemeinen eine schlechte Idee. Vielleicht ist eine -dev-Flagge ein möglicher Kompromiss, aber das var _ = <module>.Functionfunktioniert einwandfrei und ist auffällig genug, um zu verhindern, dass es eine gängige Praxis ist.
Deft_code

1
Da jemand in den folgenden Antworten darauf eingeht, empfehle ich, entweder eine IDE zu verwenden, die Importe verwaltet (Gogland, LiteIDE usw. - es gibt mehrere), oder goimportsals Schritt in Ihrem Erstellungsprozess. Ohne beides wird es sehr schnell alt.
Josef Grahn

Antworten:


36

Durch Hinzufügen eines Unterstrichs ( _) vor einem Paketnamen wird der nicht verwendete Importfehler ignoriert.

Hier ist ein Beispiel, wie Sie es verwenden könnten:

import (
    "log"
    "database/sql"

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

Verwenden Sie die leere Kennung als expliziten Paketnamen, um ein Paket ausschließlich wegen seiner Nebenwirkungen (Initialisierung) zu importieren.

Weitere Informationen finden Sie unter https://golang.org/ref/spec#Import_declarations


Dies ist die richtige Antwort. Basierend auf der GoLang-Spezifikation Doc soll ein Paket ausschließlich für Nebenwirkungen (Initialisierung) importiert werden. GoLang Spec Doc hier: golang.org/ref/spec#Import_declarations
Will

Einfach fantastisch. Dies sollte in einer Liste der zehn wichtigsten Dinge stehen, die Entwickler von Golang wissen sollten. Danke dir!
JM Janzen

9
Nicht sehr nützlich. Das Problem dabei ist, dass Sie, wenn Sie den Import später erneut verwenden möchten, den entfernen müssen _(andernfalls kann auf das Paket nicht verwiesen werden, da es keinen Namen hat). Wenn Sie das tun, können Sie es auch einfach kommentieren / auskommentieren. Der var _ = ...Trick hat dieses Problem nicht.
EM0

Wenn Sie den Unterstrich "fmt"in Gogland hinzufügen, wird er automatisch hinzugefügt, "fmt"sodass Sie beide _"fmt"und haben "fmt", was ihn in dieser IDE unbrauchbar macht
kramer65

26

Der var _ = fmt.PrintfTrick ist hier hilfreich.


Ich liebe diese Lösung. Es ist hässlich genug, um es unerwünscht zu machen, aber es funktioniert, also ist es da, wenn Sie es wirklich brauchen.
Deft_code

3
Für weitere Informationen überprüfen Sie bitte diesen Link tip.golang.org/doc/effective_go.html#blank_unused
Deepak Singh Rawat

3
Es ist im Moment hilfreich, aber als ich diese Technik verwendete, neigte ich dazu, die nicht verwendete leere Kennung später nicht mehr zu löschen, was dazu führte, dass Importe bestehen blieben, wenn ich sie auf lange Sicht wirklich nicht verwenden wollte. Die Verwendung eines Tools wie goimports hat das eigentliche Problem gelöst und stellt sicher, dass meine Importe immer minimal und sauber sind.
Mdwhatcott

Meiner Meinung nach immer noch ein dummer Hack, obwohl es wahrscheinlich das effizienteste ist.
Anthony

+1, da dies überall in der Datei möglich ist , was normalerweise eine schreckliche Idee wäre, aber sehr nützlich ist, um zu verhindern, dass Sie in der Datei herumspringen müssen, um zur importAnweisung und zurück zu gelangen, wenn Sie nur versuchen, zu kompilieren oder zu testen eine Codedatei, die Sie iterativ ausarbeiten.
mtraceur

21

Ich habe das gleiche Problem. Ich verstehe die Gründe, warum sie die Sprache implementiert haben, um nicht verwendete Importe und Variablen nicht zuzulassen, aber ich persönlich finde diese Funktion beim Schreiben meines Codes ärgerlich. Um dies zu umgehen, habe ich meinen Compiler geändert, um optionale Flags zum Zulassen nicht verwendeter Variablen und Importe in meinen Code zuzulassen.

Wenn Sie interessiert sind, können Sie dies unter https://github.com/dtnewman/modified_golang_compiler sehen .

Jetzt kann ich einfach Code mit einem Befehl wie go run -gcflags '-unused_pkgs' test.go ausführen und diese "nicht verwendeten Import" -Fehler werden nicht ausgelöst . Wenn ich diese Flags weglasse, wird standardmäßig nicht verwendete Importe nicht zugelassen.

Dies erforderte nur ein paar einfache Änderungen. Go-Puristen werden mit diesen Änderungen wahrscheinlich nicht zufrieden sein, da es gute Gründe gibt, nicht verwendete Variablen / Importe nicht zuzulassen, aber ich stimme Ihnen persönlich zu, dass dieses Problem das Codieren in Go viel weniger angenehm macht, weshalb ich diese Änderungen an meinem vorgenommen habe Compiler.


2
Ich habe das gleiche auch mit der Version 1.6 gemacht. Überprüfen Sie hier, wenn Sie interessiert sind: github.com/ronelliott/go/tree/release-branch.go1.6 HINWEIS: Einige Tests werden fehlschlagen
Ron E

2
Ich liebe die Idee dahinter. Ich sehe, dass Ihre Gabel immer noch auf Version 1.2 ist, was es nutzlos macht. Dies sollte zumindest im Standard-Go-Compiler enthalten sein, damit go run main.godie Fehler standardmäßig deaktiviert und die Fehler aktiviert go buildwerden. Auf diese Weise ist es einfach zu entwickeln go runund wenn es Zeit für die Produktion ist, müssen Sie Ihren Code immer noch bereinigen.
kramer65

17

Verwenden Sie Goimports . Es ist im Grunde eine Gabelung von gofmt, geschrieben von Brad Fitzpatrick und jetzt in den Go-Tools-Paketen enthalten. Sie können Ihren Editor so konfigurieren, dass er beim Speichern einer Datei ausgeführt wird. Sie müssen sich nie wieder um dieses Problem kümmern.


5

Wenn Sie das fmtPaket für den allgemeinen Druck zur Konsole verwenden, während Sie es entwickeln und testen, finden Sie möglicherweise eine bessere Lösung im Protokollpaket .


5
Oder die eingebaute Funktion, die printlndie Leute immer zu vergessen scheinen.
MatrixFrog

2
@MatrixFrog Auf lange Sicht ist es keine gute Idee, auf diesen Funktionen aufzubauen, da sie mit der Zeit verschwinden können. Die Verwendung von log ist eine gute Idee, da Sie diese möglicherweise behalten. Sie ist Teil der Standardbibliothek und wird wahrscheinlich nicht entfernt. Einzelheiten finden Sie in der Spezifikation .
Nemo

1
Eingebaut println? Das sind Neuigkeiten für mich. Ist es nicht dokumentiert? Ich kann es nirgendwo finden.
Matt

1
@nemo guter Punkt. Sie eignen sich perfekt, wenn Sie etwas als schnelles Einzelstück ausdrucken müssen, aber nicht beabsichtigen, es tatsächlich einzuchecken. Wahrscheinlich nicht gut, um es in einem anderen Fall zu verwenden.
MatrixFrog

1
@ MartinTournoij - Ich bin anderer Meinung. Dies war die Lösung, die ich schließlich gefunden habe, als ich dieses Problem vor 5 Jahren hatte, und mit mehr als 5 Upvotes hat es eindeutig anderen geholfen. Ich war ein Neuling, der das fmtPaket für die Protokollierung verwendete, ohne zu wissen, dass es ein vorgefertigtes Protokollierungspaket gab.
OldCurmudgeon

5

Verwenden Sie if false { ... }diese Option, um Code auskommentieren zu können . Der Code in geschweiften Klammern muss syntaktisch korrekt sein, kann aber ansonsten Unsinncode sein.


3
Mehr als syntaktisch korrekt müssen alle referenzierten Variablen (z. B. foo.Bar) usw. vorhanden sein.
Dragon

Dies ist nicht sehr sauber oder idiomatisch. Es gibt einen Grund, warum Go so entworfen wurde, wie es war
Acidic9

1
Dies ist eine nette Technik, wenn man einfach Dinge ausprobiert, während man ein Skript entwickelt oder APIs in Golang erkundet. Danke topskip!
Jay Taylor

2

Viele Leute haben bereits mit berechtigter Begründung kommentiert, und ich erkenne auch die Absicht des ursprünglichen Autors an. Rob Pike erwähnte jedoch in verschiedenen Foren, dass Go das Ergebnis einer Vereinfachung der Prozesse ist, die einigen anderen gängigen Programmiersprachen entweder fehlen oder nicht einfach zu erreichen sind. Es ist Go's Sprachsemantik und um die Kompilierung zu beschleunigen, werden viele Dinge übernommen, die zunächst ineffizient erscheinen.

Um es kurz zu machen, nicht verwendete Importe werden in Go als Fehler betrachtet, da das Programm gelöscht und die Kompilierung verlangsamt wird. Die Verwendung des Imports für Nebenwirkungen (_) ist eine Problemumgehung. Ich finde dies jedoch verwirrend, wenn es eine Mischung aus gültigen Importen mit Nebenwirkungen und Nebenwirkungen gibt, die nur zum Debuggen / Testen importiert wurden, insbesondere wenn die Codebasis verwendet wird groß und es besteht die Möglichkeit, dass Sie vergessen und nicht unbeabsichtigt löschen, was andere Ingenieure / Prüfer später verwirren kann. Früher habe ich die nicht verwendeten auskommentiert, aber beliebte IDEs wie VS-Code und Goland können goimportsproblemlos verwendet werden, was das Einfügen und Löschen der Importe ziemlich gut macht. Weitere Informationen finden Sie unter https://golang.org/doc/effective_go.html#blank_import


Danke dafür! Ich würde vorschlagen, die Codezeile explizit von der URL, die Sie in Ihre Antwort gepostet haben, als konkretes Beispiel für den Import für Nebenwirkungen zu kopieren: import _ "net/http/pprof"
Dragon

1
Danke @Dragon für deinen Vorschlag! Da ich ein neuer Mitwirkender bin, werde ich mit Hilfe von Leuten wie Ihnen meine Beiträge schnell verbessern.
sbcharr

-1

Legen Sie dies auf Ihr Dokument und vergessen Sie nicht verwendete Importe:

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

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

1
Anstatt den Compiler dazu zu bringen, toten Code zu generieren, wenn Sie dies wirklich wollten, verwenden Sie _stattdessen globale Variablen (z. B. entweder ein Paket pro Zeile oder wenn Sie darauf bestehen, alles zusammen wie :) var _, _, _, _ = fmt.Println, bufio.NewReader, os.Open, filepath.IsAbs. Aber tu das nicht, benutze es einfach goimports.
Dave C
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.