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 templateund 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 templatebietet das Paket die Must(t *Template, err error) *TemplateFunktion und das regexpPaket die MustCompile(str string) *RegexpFunktion: Sie kehren nicht zurückerrors 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, errordass bestimmte Eingabewerte nicht erzeugt werden, können Sie eine Hilfsfunktion erstellen, Must()die das nicht zurückgibt, erroraber 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
itemwird in der Regelnilim Falle eines Fehlers sein. Ohne vorher nach einem Fehler zu suchen, stürzt Ihr Code in diesem Fall ab.