Lektionen des Moduls (3/5)
Variadische Funktionen
Variadische Funktionen akzeptieren eine beliebige Anzahl von Argumenten
Gleicher Typ. Sie deklarieren sie, indem Sie ... vor den Typ des letzten setzen
Parameter. Innerhalb der Funktion ist der Parameter ein Slice.
Erklärung
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) // 10Nur der letzte Parameter kann variabel sein:
func log(prefix string, values ...any) { ... } // ok
// func wrong(...int, suffix string) {} // ERROREEine Scheibe ausbreiten
Wenn Sie bereits über ein Slice verfügen, können Sie es mit an eine Variadic-Funktion übergeben
...:
nums := []int{1, 2, 3}
sum(nums...) // 6 — espande lo slice nei singoli argomentiDas „…“ steht nach dem Slice. Ohne Spread würde man einen Typ bekommen
Fehler: Sie würden einen []int übergeben, wo die Funktion eine Sequenz erwartet
von int.
nums ist ein Slice, kein neuer Container
Innerhalb der Funktion hat nums den Typ []int. Alles Standard-Slice
Betriebsarbeit: len(nums), nums[0], range usw.
Klassischer Anwendungsfall: fmt.Println
Alle Print*-Funktionen von fmt sind vielfältig:
// signature (semplificata):
// func Println(a ...any) (n int, err error)
fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)Probieren Sie es aus
Definieren Sie sum(nums ...int) int, das die Summe aller Argumente zurückgibt.
Hinweis anzeigen
Innerhalb der Funktion hat `nums` den Typ `[]int`.
Lösung nach 3 Versuchen verfügbar
Rufen Sie die vorhandene Summenfunktion auf, indem Sie die Slice-Nummern mit Spread `nums...` übergeben.
Hinweis anzeigen
Der `...` steht NACH dem Slice-Namen.
Lösung nach 3 Versuchen verfügbar
Welcher Typ ist innerhalb von `func f(args ...string)` `args`?
func f(args ...string) {
_ = args
}Zusammenfassung
...Tals LETZTER Parameter = variadische Funktion; Darin ist[]T.- Mit einzelnen Werten aufgerufen: Der Compiler sammelt sie in einem Slice.
– Mit einem vorhandenen Slice aufgerufen:
slice...(Spread, verwendet das Slice wieder). - Alle
fmt.Print*-Funktionen sind variabel. - Nur der letzte Parameter kann variabel sein.