Lektionen des Moduls (2/5)
Mehrere Rückgabewerte und benannte Rückgaben
In Go kann eine Funktion mehrere Werte zurückgeben. Es ist der Mechanismus, der
aktiviert das (value, error)-Muster, das Sie bereits gesehen haben und das sich durchdringt
die gesamte Standardbibliothek.
Mehrere Rücksendungen
Die Rückgabetypen stehen in Klammern und sind durch Kommas getrennt:
func divmod(a, b int) (int, int) {
return a / b, a % b
}
q, r := divmod(17, 5) // q=3, r=2Sie werden durch Mehrfachbelegung destrukturiert. Eines davon verwerfen
Werte verwenden _:
_, r := divmod(17, 5) // solo il restoDas kanonische (T, error)-Muster
Fast die gesamte stdlib folgt ihm. error steht IMMER an letzter Stelle:
func read(path string) ([]byte, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("read %q: %w", path, err)
}
return data, nil
}Benannte Rückgaben
Sie können die Rückgabewerte benennen: Sie werden zu vordeklarierten Variablen
auf Null initialisiert und return ohne Argumente gibt sie zurück („naked
Rückkehr"):
func divmod(a, b int) (q, r int) {
q = a / b
r = a % b
return // naked: ritorna q, r
}Benannte Rückgaben erscheinen auch in Dokumentations-QuickInfos und sind daher nützlich als eine Form der Inline-Dokumentation für komplexe Funktionen – nicht nur für die nackte Rückkehr.
Mehr als zwei Retouren?
Nichts hält Sie von (int, int, int, error) ab, aber wenn Sie das Bedürfnis verspüren
Es ist fast immer ein Zeichen dafür, dass Sie eine Struktur zurückgeben sollten:
type Result struct {
Sum int
Avg float64
Max int
}
func analyze(nums []int) (Result, error) { ... }Probieren Sie es aus
Definieren Sie divmod(a, b int) (int, int), das Quotient und Rest zurückgibt.
Hinweis anzeigen
Rückgabetypen in Klammern: `(int, int)`.
Lösung nach 3 Versuchen verfügbar
Implementieren Sie safeDiv(a, b int) (int, error): if b == 0 return (0,errors.New('divisione per zero')), andernfalls (a/b, nil).
Hinweis anzeigen
Fehler IMMER als letzter Wert. Bei Fehler: Nullwert + Fehler.
Lösung nach 3 Versuchen verfügbar
Was druckt dieses Programm mit benannten Rückgaben?
func f() (a, b int) {
a = 1
b = 2
return
}
x, y := f()
fmt.Println(x, y)Zusammenfassung
- Mehrere Werte in Klammern:
func f() (T1, T2, error). - Konvention:
errorIMMER als letzter Wert; bei Fehler Nullwert + Fehler. – Benannte Rückgaben deklarieren die Variablen vorab und ermöglichen nackte Rückgaben. - Naked kehrt nur in sehr kurzen Funktionen zurück; Darüber hinaus leidet die Lesbarkeit.
- Mehr als 2-3 Retouren? Sie möchten wahrscheinlich eine Struktur.