Salt la conținutul principal
Modulul 3 · Lecția 3 din 513/50 în curs~10 min
Lecții din modul (3/5)

Funcții variadice

Funcțiile variadice acceptă un număr arbitrar de argumente ale acelasi tip. Le declari punând ... înaintea tipului ultimului parametrul. În interiorul funcției, parametrul este o slice.

Declaraţie

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

Doar ultimul parametru poate fi variadic:

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

Întinde o felie

Dacă aveți deja o felie, o puteți trece la o funcție variadică cu ...:

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

„...” merge după felie. Fără răspândire ai obține un tip eroare: ați transmite un []int în care funcția așteaptă o secvență din int.

nums este o felie, nu un container nou

În interiorul funcției nums are tipul []int. Toate feliile standard operațiunile funcționează: len(nums), nums[0], range etc.

Caz de utilizare clasic: fmt.Println

Toate funcțiile fmt ale Print* sunt variadice:

Go
// signature (semplificata):
// func Println(a ...any) (n int, err error)

fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)

Încearcă

Exercițiu#go.m3.l3.e1
Încercări: 0Se încarcă…

Definiți sum(nums ...int) int care returnează suma tuturor argumentelor.

Se încarcă editorul...
Afișează indiciu

În interiorul funcției `nums` are tipul `[]int`.

Soluție disponibilă după 3 încercări

Exercițiu#go.m3.l3.e2
Încercări: 0Se încarcă…

Apelați funcția de sumă existentă prin trecerea numerelor slice cu spread `nums...`.

Se încarcă editorul...
Afișează indiciu

`...` merge DUPĂ numele feliei.

Soluție disponibilă după 3 încercări

Quiz#go.m3.l3.e3
Gata

În `func f(args ...șir)`, ce tip este `args`?

Go
func f(args ...string) {
    _ = args
}
Opțiuni de răspuns

Recapitulare

  • ...T ca ULTIM parametru = functie variadica; înăuntrul este []T.
  • Apelat cu valori individuale: compilatorul le colectează într-o felie.
  • Apelat cu o slice existentă: slice... (împrăștie, reutiliza slice).
  • Toate funcțiile fmt.Print* sunt variadice.
  • Numai ultimul parametru poate fi variadic.