Vai al contenuto
eLearner.app
Modulo 3 · Lezione 3 di 513/50 nel corso~10 min
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

Go
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)    // 10

Solo l'ultimo parametro può essere variadico:

Go
func log(prefix string, values ...any) { ... }   // ok
// func wrong(...int, suffix string) {}            // ERRORE

Spread di uno slice

Se hai già uno slice, puoi passarlo a una funzione variadica con ...:

Go
nums := []int{1, 2, 3}
sum(nums...)         // 6 — espande lo slice nei singoli argomenti

Il "..." 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:

Go
// 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

Esercizio#go.m3.l3.e1
Tentativi: 0Caricamento…

Definisci sum(nums ...int) int che ritorna la somma di tutti gli argomenti.

Caricamento editor…
Mostra suggerimento

Dentro la funzione `nums` ha tipo `[]int`.

Soluzione disponibile dopo 3 tentativi

Esercizio#go.m3.l3.e2
Tentativi: 0Caricamento…

Chiama la funzione sum esistente passando lo slice nums con lo spread `nums...`.

Caricamento editor…
Mostra suggerimento

Il `...` va DOPO il nome dello slice.

Soluzione disponibile dopo 3 tentativi

Quiz#go.m3.l3.e3
Pronto

Dentro `func f(args ...string)`, di che tipo è `args`?

Go
func f(args ...string) {
    _ = args
}
Opzioni di risposta

Recap

  • ...T come 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.