Модульні уроки (3/5)
Варіативні функції
Варіадичні функції приймають довільну кількість аргументів
той самий тип. Ви оголошуєте їх, ставлячи ... перед типом останнього
параметр. Усередині функції параметром є slice.
Декларація
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Лише останній параметр може бути варіативним:
func log(prefix string, values ...any) { ... } // ok
// func wrong(...int, suffix string) {} // ERROREНамазування скибкою
Якщо у вас уже є фрагмент, ви можете передати його варіативній функції за допомогою
...:
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* є різноманітними:
// signature (semplificata):
// func Println(a ...any) (n int, err error)
fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)Спробуйте
Визначте sum(nums ...int) int, який повертає суму всіх аргументів.
Показати підказку
Усередині функції `nums` є тип `[]int`.
Рішення доступне після 3 спроб
Викличте наявну функцію sum, передавши зрізу nums із розширенням `nums...`.
Показати підказку
`...` йде ПІСЛЯ назви фрагмента.
Рішення доступне після 3 спроб
Якого типу всередині "func f(args ...string)" є "args"?
func f(args ...string) {
_ = args
}Підведення підсумків
...Tяк ОСТАННІЙ параметр = варіативна функція; всередині це[]T.- Викликається з окремими значеннями: компілятор збирає їх у фрагмент.
- Викликається з наявним фрагментом:
slice...(розповсюдження, повторне використання фрагмента). - Усі функції
fmt.Print*варіативні. - Тільки останній параметр може бути варіативним.