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
und regexp
: 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 Grund template
bietet das Paket die Must(t *Template, err error) *Template
Funktion und das regexp
Paket die MustCompile(str string) *Regexp
Funktion: Sie kehren nicht zurückerror
s weil bei bestimmungsgemäßer Verwendung die Gültigkeit der Eingabe garantiert ist.
Beispiele:
// "text" is a valid template, parsing it will not fail
var t = template.Must(template.New("name").Parse("text"))
// `^[a-z]+\[[0-9]+\]$` is a valid regexp, always compiles
var validID = regexp.MustCompile(`^[a-z]+\[[0-9]+\]$`)
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:
func Must(i Item, err error) Item {
if err != nil {
panic(err)
}
return i
}
Sie sollten dies jedoch nicht in allen Fällen verwenden, nur wenn Sie sicher sind, dass es erfolgreich ist. Verwendung:
val := Must(Get(1)).Value
Alternative / Vereinfachung
Sie können es sogar noch weiter vereinfachen, wenn Sie den Get()
Aufruf in Ihre Hilfsfunktion integrieren. Nennen wir ihn MustGet
:
func MustGet(value int) Item {
i, err := Get(value)
if err != nil {
panic(err)
}
return i
}
Verwendung:
val := MustGet(1).Value
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
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.