Lekcje modułu (3/5)
Funkcje wariadyczne
Funkcje wariadyczne akceptują dowolną liczbę argumentów funkcji
ten sam typ. Deklarujesz je, umieszczając ... przed typem ostatniego
parametr. Wewnątrz funkcji parametrem jest wycinek.
Deklaracja
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) // 10Tylko ostatni parametr może być zmienny:
func log(prefix string, values ...any) { ... } // ok
// func wrong(...int, suffix string) {} // ERRORERozkładanie plasterka
Jeśli masz już kawałek, możesz przekazać go do funkcji variadic za pomocą
...:
nums := []int{1, 2, 3}
sum(nums...) // 6 — espande lo slice nei singoli argomenti„…” pojawia się po kawałku. Bez spreadu otrzymasz typ
błąd: przekazałbyś []int, gdzie funkcja oczekuje sekwencji
z int.
nums to wycinek, a nie nowy kontener
Wewnątrz funkcji nums znajduje się typ []int. Wszystkie standardowe plasterki
operacje działają: len(nums), nums[0], range itp.
Klasyczny przypadek użycia: fmt.Println
Wszystkie funkcje Print* w fmt są zmienne:
// signature (semplificata):
// func Println(a ...any) (n int, err error)
fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)Spróbuj
Zdefiniuj sum(nums ...int) int, która zwraca sumę wszystkich argumentów.
Pokaż wskazówkę
Wewnątrz funkcji `nums` znajduje się typ `[]int`.
Rozwiązanie dostępne po 3 próbach
Wywołaj istniejącą funkcję sumy, przekazując numery wycinków ze spreadem `nums...`.
Pokaż wskazówkę
`...` znajduje się PO nazwie plasterka.
Rozwiązanie dostępne po 3 próbach
Jakiego typu w `func f(args ...string)` jest `args`?
func f(args ...string) {
_ = args
}Podsumowanie
...Tjako OSTATNI parametr = funkcja variadic; w środku jest[]T.- Wywoływane z pojedynczymi wartościami: kompilator zbiera je w plasterek.
- Wywoływany z istniejącym plasterkiem:
slice...(rozprzestrzenianie, ponowne wykorzystanie plasterka). - Wszystkie funkcje
fmt.Print*są wariacyjne. - Tylko ostatni parametr może być zmienny.