Tracks
/
Go
Go
/
Lehrplan
/
Mehrere Rückgabewerte
Me

Mehrere Rückgabewerte in Go

{one: "1 Übung", other: "%{count} Übungen"}

Über Mehrere Rückgabewerte

Funktionen und Methoden in Go können mehrere Werte zurückgeben:

func GetCard() (Card, error) { ... }

Jeder Rückgabewert muss in der richtigen Reihenfolge zugewiesen und durch Kommas getrennt werden:

card, err := GetCard()

Der Blank Identifier

Jede Position in der Zuweisung deklariert eine Variable. In Go ist es nicht erlaubt, eine Variable zu deklarieren, ohne sie zu verwenden. Verwende den Blank Identifier _ anstelle eines Variablennamens, um diesen Rückgabewert zu überspringen.

card, _ := GetCard() // error intentionally ignored
_, err := GetCard()  // card ignored, only checking for error

Fehlerbehandlung

error ist ein eingebautes Interface. Ein nil-Fehler bedeutet, dass kein Fehler aufgetreten ist; jeder Wert ungleich nil bedeutet, dass etwas schiefgelaufen ist. Nach Konvention sollten Funktionen, die fehlschlagen können, als letzten Wert einen error zurückgeben. Der Aufrufer muss ihn prüfen, bevor er andere Rückgabewerte verwendet:

card, err := GetCard()
if err != nil {
    // unsafe to use card here
    return err
}
// safe to use card here

Das Komma-ok-Idiom

Das Zwei-Werte-Zuweisungsmuster tritt auch außerhalb der error-Behandlung auf. Auch Map-Zugriffe, Typzusicherungen und das Empfangen aus Channels verwenden einen zweiten booleschen Wert, konventionell ok genannt, um Erfolg oder das Vorhandensein von Daten anzuzeigen:

m := map[string]int{"a": 1}
v, ok := m["a"] // ok is true
v, ok = m["z"]  // ok is false
var i interface{} = "hello"
v, ok := i.(string) // ok is true
v, ok = i.(int)     // ok is false
v, ok := <-ch // ok is false if ch is closed and empty

Benannte Rückgabewerte

Rückgabewerte können in der Funktionssignatur auch Namen erhalten. Diese Variablen sind dann im Funktionskörper zugänglich.

func divide(a, b int) (quotient, remainder int) {
    quotient = a / b
    remainder = a % b
    return quotient, remainder
}

Benannte Rückgabewerte dokumentieren die Bedeutung jeder Rückgabeposition. Sie lassen sich auch mit einem nackten Return verwenden, also einem Return ohne Werte. Nackte Returns geben implizit die aktuellen Werte der benannten Variablen zurück:

func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

In längeren Funktionen beeinträchtigen nackte Returns oft die Lesbarkeit, weil unklar ist, was zurückgegeben wird. Bevorzuge explizite Rückgabewerte, es sei denn, die Funktion ist so kurz, dass die Signatur immer sichtbar ist.

Um mehr zu erfahren, schau dir Go by Example: Multiple Return Values, Effective Go: Multiple Returns oder die Tour of Go an.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab