Passer au contenu principal
eLearner.app
Module 3 · Leçon 2 sur 512/50 dans le cours~12 min
Leçons du module (2/5)

Retours multiples et retours nommés

Dans Go, une fonction peut renvoyer plusieurs valeurs. C'est le mécanisme qui active le modèle (value, error) que vous avez déjà vu et qui imprègne toute la bibliothèque standard.

Retours multiples

Les types de retour sont placés entre parenthèses, séparés par des virgules :

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

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

Ils sont déstructurés avec affectation multiple. Pour rejeter l'un des les valeurs utilisent _ :

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

Le modèle canonique (T, error)

Presque tout le stdlib le suit. error est TOUJOURS le dernier :

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
}

Retours nommés

Vous pouvez nommer les valeurs de retour : elles deviennent des variables pré-déclarées initialisé à zéro, et return sans argument les renvoie ("nu retour") :

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

Les retours nommés apparaissent également dans les info-bulles de la documentation, ils sont donc utiles comme une forme de documentation en ligne pour les fonctions complexes - pas seulement pour le retour nu.

Plus de deux retours ?

Rien ne vous arrête de (int, int, int, error), mais si vous en ressentez le besoin c'est presque toujours un signe que vous devez renvoyer une struct :

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

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

Essayez-le

Exercice#go.m3.l2.e1
Tentatives : 0Chargement…

Définissez divmod(a, b int) (int, int) qui renvoie le quotient et le reste.

Chargement de l'éditeur…
Afficher l'indice

Types de retour entre parenthèses : `(int, int)`.

Solution disponible après 3 tentatives

Exercice#go.m3.l2.e2
Tentatives : 0Chargement…

Implémentez safeDiv(a, b int) (int, error) : si b == 0 renvoie (0, erreurs.New('divisione per zero')), sinon (a/b, nil).

Chargement de l'éditeur…
Afficher l'indice

Erreur TOUJOURS comme dernière valeur. Sur erreur : valeur zéro + erreur.

Solution disponible après 3 tentatives

Quiz#go.m3.l2.e3
Prêt

Qu'imprime ce programme à l'aide de retours nommés ?

Go
func f() (a, b int) {
    a = 1
    b = 2
    return
}
x, y := f()
fmt.Println(x, y)
Options de réponse

Récapitulatif

  • Valeurs multiples entre parenthèses : func f() (T1, T2, error).
  • Convention : error TOUJOURS comme dernière valeur ; sur erreur, valeur zéro + erreur.
  • Les retours nommés pré-déclarent les variables et activent les retours nus.
  • Naked ne revient que dans des fonctions très courtes ; au-delà, la lisibilité en souffre.
  • Plus de 2-3 retours ? Vous voulez probablement une structure.