Direkt zum Hauptinhalt springen
eLearner.app
Modul 3 · Lektion 2 von 512/50 im Kurs~12 min
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:

Go
func divmod(a, b int) (int, int) {
    return a / b, a % b
}

q, r := divmod(17, 5) // q=3, r=2

Sie werden durch Mehrfachbelegung destrukturiert. Eines davon verwerfen Werte verwenden _:

Go
_, r := divmod(17, 5) // solo il resto

Das kanonische (T, error)-Muster

Fast die gesamte stdlib folgt ihm. error steht IMMER an letzter Stelle:

Go
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"):

Go
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:

Go
type Result struct {
    Sum  int
    Avg  float64
    Max  int
}

func analyze(nums []int) (Result, error) { ... }

Probieren Sie es aus

Übung#go.m3.l2.e1
Versuche: 0Wird geladen…

Definieren Sie divmod(a, b int) (int, int), das Quotient und Rest zurückgibt.

Editor wird geladen…
Hinweis anzeigen

Rückgabetypen in Klammern: `(int, int)`.

Lösung nach 3 Versuchen verfügbar

Übung#go.m3.l2.e2
Versuche: 0Wird geladen…

Implementieren Sie safeDiv(a, b int) (int, error): if b == 0 return (0,errors.New('divisione per zero')), andernfalls (a/b, nil).

Editor wird geladen…
Hinweis anzeigen

Fehler IMMER als letzter Wert. Bei Fehler: Nullwert + Fehler.

Lösung nach 3 Versuchen verfügbar

Quiz#go.m3.l2.e3
Bereit

Was druckt dieses Programm mit benannten Rückgaben?

Go
func f() (a, b int) {
    a = 1
    b = 2
    return
}
x, y := f()
fmt.Println(x, y)
Antwortoptionen

Zusammenfassung

  • Mehrere Werte in Klammern: func f() (T1, T2, error).
  • Konvention: error IMMER 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.