Перейти до основного вмісту
Модуль 3 · Урок 3 із 513/50 у курсі~10 min
Модульні уроки (3/5)

Варіативні функції

Варіадичні функції приймають довільну кількість аргументів той самий тип. Ви оголошуєте їх, ставлячи ... перед типом останнього параметр. Усередині функції параметром є slice.

Декларація

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

Лише останній параметр може бути варіативним:

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

Намазування скибкою

Якщо у вас уже є фрагмент, ви можете передати його варіативній функції за допомогою ...:

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

"..." йде після фрагмента. Без поширення ви отримаєте тип помилка: ви передаєте []int, де функція очікує послідовності з int.

nums — це фрагмент, а не новий контейнер

Усередині функції nums є тип []int. Весь стандартний зріз операції працюють: len(nums), nums[0], range тощо.

Класичний варіант використання: fmt.Println

Усі функції fmt Print* є різноманітними:

Go
// signature (semplificata):
// func Println(a ...any) (n int, err error)

fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)

Спробуйте

вправи#go.m3.l3.e1
Спроби: 0Завантаження…

Визначте sum(nums ...int) int, який повертає суму всіх аргументів.

Завантаження редактора…
Показати підказку

Усередині функції `nums` є тип `[]int`.

Рішення доступне після 3 спроб

вправи#go.m3.l3.e2
Спроби: 0Завантаження…

Викличте наявну функцію sum, передавши зрізу nums із розширенням `nums...`.

Завантаження редактора…
Показати підказку

`...` йде ПІСЛЯ назви фрагмента.

Рішення доступне після 3 спроб

Quiz#go.m3.l3.e3
Готовий

Якого типу всередині "func f(args ...string)" є "args"?

Go
func f(args ...string) {
    _ = args
}
Варіанти відповідей

Підведення підсумків

  • ...T як ОСТАННІЙ параметр = варіативна функція; всередині це []T.
  • Викликається з окремими значеннями: компілятор збирає їх у фрагмент.
  • Викликається з наявним фрагментом: slice... (розповсюдження, повторне використання фрагмента).
  • Усі функції fmt.Print* варіативні.
  • Тільки останній параметр може бути варіативним.