Przejdź do głównej treści
eLearner.app
Moduł 3 · Lekcja 3 z 513/50 w kursie~10 min
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

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

Tylko ostatni parametr może być zmienny:

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

Rozkładanie plasterka

Jeśli masz już kawałek, możesz przekazać go do funkcji variadic za pomocą ...:

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

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

Ćwiczenie#go.m3.l3.e1
Próby: 0Ładowanie...

Zdefiniuj sum(nums ...int) int, która zwraca sumę wszystkich argumentów.

Ładowanie edytora...
Pokaż wskazówkę

Wewnątrz funkcji `nums` znajduje się typ `[]int`.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#go.m3.l3.e2
Próby: 0Ładowanie...

Wywołaj istniejącą funkcję sumy, przekazując numery wycinków ze spreadem `nums...`.

Ładowanie edytora...
Pokaż wskazówkę

`...` znajduje się PO nazwie plasterka.

Rozwiązanie dostępne po 3 próbach

Quiz#go.m3.l3.e3
Gotowe

Jakiego typu w `func f(args ...string)` jest `args`?

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

Podsumowanie

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