Aufgrund der Fehlerbehandlung in Go habe ich häufig Funktionen mit mehreren Werten. Bisher war die Art und Weise, wie ich das geschafft habe, sehr chaotisch und ich suche nach Best Practices, um saubereren Code zu schreiben.
Angenommen, ich habe folgende Funktion:
type Item struct {
Value int
Name string
}
func Get(value int) (Item, error) {
// some code
return item, nil
}
Wie kann ich item.Value
elegant eine neue Variable zuweisen ? Bevor item
ich die Fehlerbehandlung einführte, kehrte meine Funktion zurück und ich konnte einfach Folgendes tun:
val := Get(1).Value
Jetzt mache ich das:
item, _ := Get(1)
val := item.Value
Gibt es nicht eine Möglichkeit, direkt auf die erste zurückgegebene Variable zuzugreifen?
go
error-handling
return-value
multiple-return-values
Speerfischer
quelle
quelle
item
wird in der Regelnil
im Falle eines Fehlers sein. Ohne vorher nach einem Fehler zu suchen, stürzt Ihr Code in diesem Fall ab.Antworten:
Bei einer mehrwertigen Rückgabefunktion können Sie beim Aufrufen der Funktion nicht auf Felder oder Methoden eines bestimmten Werts des Ergebnisses verweisen.
Und wenn einer von ihnen ein ist
error
, ist er aus einem Grund vorhanden (die Funktion kann fehlschlagen), und Sie sollten ihn nicht umgehen, da in diesem Fall Ihr nachfolgender Code möglicherweise auch kläglich fehlschlägt (z. B. was zur Laufzeitpanik führt).Es kann jedoch Situationen geben, in denen Sie wissen, dass der Code unter keinen Umständen fehlschlägt. In diesen Fällen können Sie eine Hilfsfunktion (oder -methode) bereitstellen, mit der die Funktion verworfen wird
error
(oder eine Laufzeitpanik ausgelöst wird, wenn sie weiterhin auftritt).Dies kann der Fall sein, wenn Sie die Eingabewerte für eine Funktion aus Code bereitstellen und wissen, dass sie funktionieren. Gute
Beispiele hierfür sind die Pakete
template
undregexp
: Wenn Sie zur Kompilierungszeit eine gültige Vorlage oder einen gültigen regulären Ausdruck bereitstellen, können Sie sicher sein, dass sie zur Laufzeit immer fehlerfrei analysiert werden können. Aus diesem Grundtemplate
bietet das Paket dieMust(t *Template, err error) *Template
Funktion und dasregexp
Paket dieMustCompile(str string) *Regexp
Funktion: Sie kehren nicht zurückerror
s weil bei bestimmungsgemäßer Verwendung die Gültigkeit der Eingabe garantiert ist.Beispiele:
Zurück zu Ihrem Fall
Wenn Sie sicher
Get()
sein können,error
dass bestimmte Eingabewerte nicht erzeugt werden, können Sie eine Hilfsfunktion erstellen,Must()
die das nicht zurückgibt,error
aber eine Laufzeitpanik auslöst, wenn es immer noch auftritt:Sie sollten dies jedoch nicht in allen Fällen verwenden, nur wenn Sie sicher sind, dass es erfolgreich ist. Verwendung:
Alternative / Vereinfachung
Sie können es sogar noch weiter vereinfachen, wenn Sie den
Get()
Aufruf in Ihre Hilfsfunktion integrieren. Nennen wir ihnMustGet
:Verwendung:
Sehen Sie einige interessante / verwandte Fragen:
wie man mehrere Rückgaben in Golang analysiert
Rückgabe der Karte wie 'ok' in Golang bei normalen Funktionen
quelle
Nein, aber das ist gut so, denn Sie sollten immer mit Ihren Fehlern umgehen.
Es gibt Techniken, mit denen Sie die Fehlerbehandlung verschieben können. Siehe Fehler sind Werte von Rob Pike.
In diesem Beispiel aus dem Blog-Beitrag zeigt er, wie Sie einen
errWriter
Typ erstellen können, der die Fehlerbehandlung verzögert, bis Sie mit dem Aufrufen fertig sindwrite
.quelle
Ja da ist.
Überraschend, oder? Mit einer einfachen
mute
Funktion können Sie einen bestimmten Wert aus einer Mehrfachrückgabe abrufen :https://play.golang.org/p/IwqmoKwVm-
Beachten Sie, wie Sie die Wertnummer wie aus einem Slice / Array auswählen und dann den Typ, um den tatsächlichen Wert zu erhalten.
Sie können mehr über die Wissenschaft dahinter lesen diesem Artikel . Credits an den Autor.
quelle
Nein, Sie können nicht direkt auf den ersten Wert zugreifen.
Ich nehme an, ein Hack dafür wäre, ein Array von Werten anstelle von "item" und "err" zurückzugeben und dann einfach zu tun,
item, _ := Get(1)[0]
aber ich würde dies nicht empfehlen.quelle
Wie wäre es mit diesem Weg?
quelle