Direct naar de hoofdinhoud
Module 3 · Les 2 van 512/50 in de cursus~12 min
Modulelessen (2/5)

Meerdere retourzendingen en retourzendingen op naam

In Go kan een functie meerdere waarden retourneren. Het is het mechanisme dat maakt het (value, error) patroon mogelijk dat je al hebt gezien en dat doordringt de gehele standaardbibliotheek.

Meerdere retourzendingen

De retourtypen staan ​​tussen haakjes, door komma's gescheiden:

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

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

Ze zijn gedestructureerd met meerdere opdrachten. Om een van de weg te gooien waarden gebruiken _:

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

Het canonieke (T, error) patroon

Bijna de hele stdlib volgt dit. error is ALTIJD laatste:

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
}

Genoemde retouren

U kunt de geretourneerde waarden een naam geven: ze worden vooraf gedeclareerde variabelen geïnitialiseerd op nul, en return zonder argumenten retourneert ze ("naked retour"):

Go
func divmod(a, b int) (q, r int) {
    q = a / b
    r = a % b
    return       // naked: ritorna q, r
}

Benoemde retouren verschijnen ook in de tooltips van de documentatie, dus ze zijn nuttig als een vorm van inline documentatie voor complexe functies — niet alleen voor de naakte terugkeer.

Meer dan twee retourzendingen?

Niets houdt je tegen om (int, int, int, error) te gebruiken, tenzij je daar behoefte aan hebt het is bijna altijd een teken dat je een struct moet retourneren:

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

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

Probeer het

Oefening#go.m3.l2.e1
Pogingen: 0Laden…

Definieer divmod(a, b int) (int, int) die quotiënt en rest retourneert.

Editor laden…
Toon hint

Retourtypen tussen haakjes: `(int, int)`.

Oplossing beschikbaar na 3 pogingen

Oefening#go.m3.l2.e2
Pogingen: 0Laden…

Implementeer safeDiv(a, b int) (int, error): als b == 0 return (0, fouten.New('divisione per zero')), anders (a/b, nul).

Editor laden…
Toon hint

Fout ALTIJD als laatste waarde. Bij fout: nulwaarde + fout.

Oplossing beschikbaar na 3 pogingen

Quiz#go.m3.l2.e3
Klaar

Wat drukt dit programma af met behulp van benoemde retourneringen?

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

Samenvatten

  • Meerdere waarden tussen haakjes: func f() (T1, T2, error).
  • Conventie: error ALTIJD als laatste waarde; bij fout, nulwaarde + fout.
  • Benoemde rendementen declareren vooraf de variabelen en maken naakte rendementen mogelijk.
  • Naakt keert alleen terug in zeer korte functies; verder lijdt de leesbaarheid eronder.
  • Meer dan 2-3 retourzendingen? Waarschijnlijk wil je een structuur.