Lezioni del modulo (3/5)
Funzioni variadiche
Le funzioni variadiche accettano un numero arbitrario di argomenti
dello stesso tipo. Si dichiarano mettendo ... davanti al tipo dell'ultimo
parametro. Dentro la funzione il parametro è uno slice.
Dichiarazione
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) // 10Solo l'ultimo parametro può essere variadico:
func log(prefix string, values ...any) { ... } // ok
// func wrong(...int, suffix string) {} // ERRORESpread di uno slice
Se hai già uno slice, puoi passarlo a una funzione variadica con ...:
nums := []int{1, 2, 3}
sum(nums...) // 6 — espande lo slice nei singoli argomentiIl "..." si scrive dopo lo slice. Senza spread otterresti un errore di
tipo: stai passando un []int dove la funzione si aspetta una sequenza
di int.
nums è una slice, non un nuovo container
Dentro la funzione nums ha tipo []int. Tutte le operazioni standard
sulle slice funzionano: len(nums), nums[0], range, ecc.
Caso d'uso classico: fmt.Println
Tutte le Print* di fmt sono variadiche:
// signature (semplificata):
// func Println(a ...any) (n int, err error)
fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)Prova tu
Definisci sum(nums ...int) int che ritorna la somma di tutti gli argomenti.
Mostra suggerimento
Dentro la funzione `nums` ha tipo `[]int`.
Soluzione disponibile dopo 3 tentativi
Chiama la funzione sum esistente passando lo slice nums con lo spread `nums...`.
Mostra suggerimento
Il `...` va DOPO il nome dello slice.
Soluzione disponibile dopo 3 tentativi
Dentro `func f(args ...string)`, di che tipo è `args`?
func f(args ...string) {
_ = args
}Recap
...Tcome ULTIMO parametro = funzione variadica; dentro è[]T.- Chiamata con singoli valori: il compilatore raccoglie in una slice.
- Chiamata con slice esistente:
slice...(spread, riusa la slice). - Tutte le
fmt.Print*sono variadiche. - Solo l'ultimo parametro può essere variadico.