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:
func divmod(a, b int) (int, int) {
return a / b, a % b
}
q, r := divmod(17, 5) // q=3, r=2Ze zijn gedestructureerd met meerdere opdrachten. Om een van de weg te gooien
waarden gebruiken _:
_, r := divmod(17, 5) // solo il restoHet canonieke (T, error) patroon
Bijna de hele stdlib volgt dit. error is ALTIJD laatste:
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"):
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:
type Result struct {
Sum int
Avg float64
Max int
}
func analyze(nums []int) (Result, error) { ... }Probeer het
Definieer divmod(a, b int) (int, int) die quotiënt en rest retourneert.
Toon hint
Retourtypen tussen haakjes: `(int, int)`.
Oplossing beschikbaar na 3 pogingen
Implementeer safeDiv(a, b int) (int, error): als b == 0 return (0, fouten.New('divisione per zero')), anders (a/b, nul).
Toon hint
Fout ALTIJD als laatste waarde. Bij fout: nulwaarde + fout.
Oplossing beschikbaar na 3 pogingen
Wat drukt dit programma af met behulp van benoemde retourneringen?
func f() (a, b int) {
a = 1
b = 2
return
}
x, y := f()
fmt.Println(x, y)Samenvatten
- Meerdere waarden tussen haakjes:
func f() (T1, T2, error). - Conventie:
errorALTIJD 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.