2017-12-22 10 views
3

Wenn ich eine Zeichenfolge als Text analysiere, möchte ich, dass jede nicht analysierbare Zeichenfolge zu einer Nullzeit führt, und mache dann weiter.Ist es eine schlechte Übung, einen Fehler in Golang zurückzusetzen?

passwordLastUsed, err = time.Parse(time.RFC3339, record[lastUsed]) 
if err != nil { 
    err = nil 
    passwordLastUsed = time.Time{} 
} 

Dieser Code sieht ein bisschen chaotisch und die 'ineffassign' Linter gibt diese für die 'err = nil' Aussage:

Warnung: ineffektiv Zuordnung irren (ineffassign)

Gibt es einen besseren Weg dies zu handhaben oder sollte ich den Linter einfach ignorieren?

+6

Es ist wahrscheinlich nur sagen, dass Sie nicht die 'err' Variable später nicht verwenden, nachdem es auf Null einstellen, so dass Sie könnte genauso gut es nicht Null ist, machen und Set passwordLastUsed nur – xs0

+0

To füge einen Kontext hinzu, 'err' ist ein benannter Rücksprung von der Funktion, in der dieser Ausschnitt sitzt. Ich benutze ihn woanders in der Funktion und gebe ihn sofort zurück, wenn eine Funktion, die er aufruft, keinen Nicht-Null-Wert zurückgibt. – jonhadfield

+0

Sie können es woanders verwenden, aber Sie setzen es bedingungslos, bevor Sie es erneut überprüfen - sonst würden Sie diese Warnung nicht erhalten. – Flimzy

Antwort

3

Es ist nicht schlecht, eine Fehlervariable zurückzusetzen, wenn Sie das möchten.

Es ist eine schlechte Methode, Variablen festzulegen, die später nicht mehr verwendet werden - und darum geht es in der Warnung.

Wahrscheinlich gibt es nie einen Grund, um einen Fehler zurückgesetzt wie Sie tun, da nach dem if Block err wird immernil sein.

Es macht Sinn, wenn Sie nur in einigen Fällen zurückgesetzt werden. Ein gängiges Beispiel:

result, err := db.Query(...) 
if err == sql.ErrNoRows { 
    err = nil // Ignore not-found rows 
} 
if err != nil { 
    return err // But return all other errors 
} 
+0

Das macht Sinn, danke. Ich benutze es später, also denke ich, dass der Linter in diesem speziellen Fall falsch ist. – jonhadfield

+0

Nein, der Linter ist korrekt. Möglicherweise verwenden Sie es später, aber erst, nachdem es erneut bedingungslos zurückgesetzt wurde. – Flimzy

+1

Ok, ich verstehe jetzt. Ich fügte einen weiteren Check "if err! = Nil" unmittelbar nach diesem Schnipsel hinzu und es wurde nicht mehr als ineffektiv wiederholt. Wie du schon sagtest, denn nach dem Code war err immer gleich null, und das nächste Stück Code setzte den Wert von err zurück, es war wirklich unwirksam. – jonhadfield

Verwandte Themen