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
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) // 10Doar ultimul parametru poate fi variadic:
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
...:
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:
// signature (semplificata):
// func Println(a ...any) (n int, err error)
fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)Încearcă
Definiți sum(nums ...int) int care returnează suma tuturor argumentelor.
Afișează indiciu
În interiorul funcției `nums` are tipul `[]int`.
Soluție disponibilă după 3 încercări
Apelați funcția de sumă existentă prin trecerea numerelor slice cu spread `nums...`.
Afișează indiciu
`...` merge DUPĂ numele feliei.
Soluție disponibilă după 3 încercări
În `func f(args ...șir)`, ce tip este `args`?
func f(args ...string) {
_ = args
}Recapitulare
...Tca 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.