it-swarm.com.de

So vermeiden Sie lästige Fehler "deklariert und nicht verwendet"

Ich lerne Go, finde es aber etwas ärgerlich, dass ich beim Kompilieren keine Variablen oder Pakete ungenutzt lassen sollte.

Das verlangsamt mich wirklich ziemlich. Ich wollte zum Beispiel nur ein neues Paket deklarieren und es später verwenden oder nur einen Testbefehl auskommentieren. Ich bekomme immer den Fehler und muss all diese Verwendungen kommentieren.

Gibt es eine Möglichkeit, diese Art des Eincheckens in Go zu vermeiden?

176
A-letubby

Dieser Fehler zwingt Sie dazu, besseren Code zu schreiben und alles zu verwenden, was Sie deklarieren oder importieren. Dies erleichtert das Lesen von Code, der von anderen Personen geschrieben wurde (Sie sind sich immer sicher, dass alle deklarierten Variablen verwendet werden), und vermeidet möglicherweise toten Code.

Wenn Sie diesen Fehler jedoch wirklich überspringen möchten, können Sie den leeren Bezeichner (_):

package main

import (
    "fmt" // imported and not used: "fmt"
)

func main() {
    i := 1 // i declared and not used
}

wird

package main

import (
    _ "fmt" // no more error
)

func main() {
    i := 1 // no more error
    _ = i
}

Wie von kostix in den Kommentaren unten gesagt, finden Sie die offizielle Position des Go-Teams in den FAQ :

Das Vorhandensein einer nicht verwendeten Variablen kann auf einen Fehler hinweisen, während nicht verwendete Importe die Kompilierung verlangsamen. Sammeln Sie genügend nicht verwendete Importe in Ihrem Codebaum und es kann sehr langsam werden. Aus diesen Gründen lässt Go keine zu.

187
Florent Bayle

Nach die FAQ :

Einige haben nach einer Compiler-Option gefragt, um diese Prüfungen zu deaktivieren oder zumindest auf Warnungen zu reduzieren. Eine solche Option wurde jedoch nicht hinzugefügt, da Compiler-Optionen die Semantik der Sprache nicht beeinflussen sollten und der Go-Compiler keine Warnungen meldet, sondern nur Fehler, die das Kompilieren verhindern.

Es gibt zwei Gründe, keine Warnungen zu haben. Erstens, wenn es sich lohnt, sich zu beschweren, lohnt es sich, dies im Code zu korrigieren. (Und wenn es sich nicht lohnt, es zu beheben, ist es auch nicht erwähnenswert.) Zweitens wird die Implementierung durch das Generieren von Warnungen durch den Compiler dazu angeregt, vor schwachen Fällen zu warnen, die das Kompilieren verrauschen lassen und echte Fehler maskieren, die behoben werden sollten.

Ich stimme dem aus verschiedenen Gründen nicht unbedingt zu, die es nicht wert sind, darauf einzugehen. Es ist, was es ist, und es wird sich in naher Zukunft wahrscheinlich nicht ändern.

Für Pakete gibt es das Tool goimports , mit dem fehlende Pakete automatisch hinzugefügt und nicht verwendete entfernt werden. Zum Beispiel:

# Install it
$ go get golang.org/x/tools/cmd/goimports

# -w to write the source file instead of stdout
$ goimports -w my_file.go

Sie sollten dies von jedem halbwegs anständigen Editor ausführen können - zum Beispiel für Vim:

:!goimports -w %

Die Seite goimports listet einige Befehle für andere Editoren auf, und Sie legen normalerweise fest, dass sie automatisch ausgeführt werden, wenn Sie den Puffer auf der Festplatte speichern.

Beachten Sie, dass goimports auch gofmt ausführt.


Wie bereits erwähnt, ist es für Variablen am einfachsten, sie (vorübergehend) _ Zuzuweisen:

// No errors
tasty := "ice cream"
horrible := "marmite"

// Commented out for debugging
//eat(tasty, horrible)

_, _ = tasty, horrible
23
Martin Tournoij

Sie können hierfür eine einfache "Nullfunktion" verwenden, zum Beispiel:

func Use(vals ...interface{}) {
    for _, val := range vals {
        _ = val
    }
}

Was du so benutzen kannst:

package main

func main() {
    a := "declared and not used"
    b := "another declared and not used"
    c := 123

    Use(a, b, c)
}

Es gibt auch ein Paket dafür , damit Sie nicht jedes Mal die Funktion Use definieren müssen:

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

func main() {
  // [..]

  xulu.Use(a, b, c)
}
20
lunux2008

Ein bisher nicht erwähnter Winkel sind Werkzeugsätze, die zum Bearbeiten des Codes verwendet werden.

Wenn Sie Visual Studio Code zusammen mit der Erweiterung von lukehoban mit dem Namen Go verwenden, werden Sie automatisch zaubern . Die Go-Erweiterung führt automatisch gofmt, golint usw. aus und entfernt import Einträge und fügt sie hinzu . Zumindest dieser Teil ist jetzt automatisch.

Ich gebe zu, es ist nicht 100% der Lösung der Frage, aber dennoch nützlich genug.

8
miltonb

Wenn es anderen schwer fällt, dies zu verstehen, kann es meiner Meinung nach hilfreich sein, dies in sehr einfachen Worten zu erklären. Wenn Sie eine Variable haben, die Sie nicht verwenden, zum Beispiel eine Funktion, für die Sie den Aufruf auskommentiert haben (ein üblicher Anwendungsfall):

myFn := func () { }
// myFn()

Sie können der Funktion eine unbrauchbare/leere Variable zuweisen, damit sie nicht mehr verwendet wird nicht verwendet:

myFn := func () { }
_ = myFn
// myFn()
4
max pleaner