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 :
func divmod(a, b int) (int, int) {
return a / b, a % b
}
q, r := divmod(17, 5) // q=3, r=2Ils sont déstructurés avec affectation multiple. Pour rejeter l'un des
les valeurs utilisent _ :
_, r := divmod(17, 5) // solo il restoLe modèle canonique (T, error)
Presque tout le stdlib le suit. error est TOUJOURS le dernier :
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") :
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 :
type Result struct {
Sum int
Avg float64
Max int
}
func analyze(nums []int) (Result, error) { ... }Essayez-le
Définissez divmod(a, b int) (int, int) qui renvoie le quotient et le reste.
Afficher l'indice
Types de retour entre parenthèses : `(int, int)`.
Solution disponible après 3 tentatives
Implémentez safeDiv(a, b int) (int, error) : si b == 0 renvoie (0, erreurs.New('divisione per zero')), sinon (a/b, nil).
Afficher l'indice
Erreur TOUJOURS comme dernière valeur. Sur erreur : valeur zéro + erreur.
Solution disponible après 3 tentatives
Qu'imprime ce programme à l'aide de retours nommés ?
func f() (a, b int) {
a = 1
b = 2
return
}
x, y := f()
fmt.Println(x, y)Récapitulatif
- Valeurs multiples entre parenthèses :
func f() (T1, T2, error). - Convention :
errorTOUJOURS 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.