Direct naar de hoofdinhoud
Module 3 · Les 3 van 513/50 in de cursus~10 min
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

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

Alleen de laatste parameter kan variadisch zijn:

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

Een plakje uitspreiden

Als je al een slice hebt, kun je deze doorgeven aan een variadische functie met ...:

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

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

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

Oefening#go.m3.l3.e1
Pogingen: 0Laden…

Definieer sum(nums ...int) int die de som van alle argumenten retourneert.

Editor laden…
Toon hint

Binnen de functie `nums` staat het type `[]int`.

Oplossing beschikbaar na 3 pogingen

Oefening#go.m3.l3.e2
Pogingen: 0Laden…

Roep de bestaande somfunctie op door de slice nums met spread `nums...` door te geven.

Editor laden…
Toon hint

De `...` gaat NA de segmentnaam.

Oplossing beschikbaar na 3 pogingen

Quiz#go.m3.l3.e3
Klaar

Welk type is binnen `func f(args ...string)` `args`?

Go
func f(args ...string) {
    _ = args
}
Antwoordmogelijkheden

Samenvatten

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