Modulelessen (3/5)
Variadische functies
Variadische functies accepteren een willekeurig aantal argumenten van de
hetzelfde type. Je declareert ze door ... vóór het type laatste te plaatsen
parameter. Binnen de functie is de parameter een slice.
Verklaring
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) // 10Alleen de laatste parameter kan variadisch zijn:
func log(prefix string, values ...any) { ... } // ok
// func wrong(...int, suffix string) {} // ERROREEen plakje uitspreiden
Als je al een slice hebt, kun je deze doorgeven aan een variadische functie met
...:
nums := []int{1, 2, 3}
sum(nums...) // 6 — espande lo slice nei singoli argomentiDe "..." komt na het segment. Zonder spreiding zou je een type krijgen
error: je zou een []int doorgeven waar de functie een reeks verwacht
van int.
nums is een segment, geen nieuwe container
Binnen de functie nums heeft het type []int. Allemaal standaard segment
bewerkingen werken: len(nums), nums[0], range, enz.
Klassiek gebruiksscenario: fmt.Println
Alle fmt functies van Print* zijn variadisch:
// signature (semplificata):
// func Println(a ...any) (n int, err error)
fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)Probeer het
Definieer sum(nums ...int) int die de som van alle argumenten retourneert.
Toon hint
Binnen de functie `nums` staat het type `[]int`.
Oplossing beschikbaar na 3 pogingen
Roep de bestaande somfunctie op door de slice nums met spread `nums...` door te geven.
Toon hint
De `...` gaat NA de segmentnaam.
Oplossing beschikbaar na 3 pogingen
Welk type is binnen `func f(args ...string)` `args`?
func f(args ...string) {
_ = args
}Samenvatten
...Tals LAATSTE parameter = variadische functie; binnen is het[]T.- Aangeroepen met enkele waarden: de compiler verzamelt ze in een segment.
- Aangeroepen met een bestaand segment:
slice...(verspreid, hergebruikt het segment). - Alle
fmt.Print*functies zijn variadisch. - Alleen de laatste parameter kan variadisch zijn.