Leçons du module (3/5)
Fonctions variadiques
Les fonctions variadiques acceptent un nombre arbitraire d'arguments du
même type. Vous les déclarez en mettant ... avant le type du dernier
paramètre. À l'intérieur de la fonction, le paramètre est une slice.
Déclaration
func sum(nums ...int) int {
tot := 0
for _, n := range nums {
tot += n
}
return tot
}
sum() // 0 (nums = []int{})
sum(1) // 1
sum(1, 2, 3, 4) // 10Seul le dernier paramètre peut être variadique :
func log(prefix string, values ...any) { ... } // ok
// func wrong(...int, suffix string) {} // ERROREÉtaler une tranche
Si vous possédez déjà une tranche, vous pouvez la passer à une fonction variadique avec
...:
nums := []int{1, 2, 3}
sum(nums...) // 6 — espande lo slice nei singoli argomentiLe "..." va après la tranche. Sans propagation, vous obtiendriez un type
erreur : vous passeriez un []int où la fonction attend une séquence
de int.
nums est une tranche, pas un nouveau conteneur
À l’intérieur de la fonction nums a le type []int. Toutes les tranches standards
travaux d'exploitation : len(nums), nums[0], range, etc.
Cas d'utilisation classique : fmt.Println
Toutes les fonctions Print* de fmt sont variadiques :
// signature (semplificata):
// func Println(a ...any) (n int, err error)
fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)Essayez-le
Définissez sum(nums ...int) int qui renvoie la somme de tous les arguments.
Afficher l'indice
À l’intérieur de la fonction `nums` a le type `[]int`.
Solution disponible après 3 tentatives
Appelez la fonction de somme existante en passant les numéros de tranche avec spread `nums...`.
Afficher l'indice
Le `...` va APRÈS le nom de la tranche.
Solution disponible après 3 tentatives
Dans `func f(args ...string)`, de quel type est `args` ?
func f(args ...string) {
_ = args
}Récapitulatif
...Tcomme paramètre LAST = fonction variadique ; à l'intérieur, c'est[]T.- Appelé avec des valeurs uniques : le compilateur les collecte dans une tranche.
- Appelé avec une slice existante :
slice...(spread, réutilise la slice). - Toutes les fonctions
fmt.Print*sont variadiques. - Seul le dernier paramètre peut être variadique.