Урок 2~9 минут
Variadic-функции
Что такое variadic-функция
Variadic-функция принимает переменное количество аргументов одного типа. Три точки ... перед типом делают параметр variadic:
go
func sum(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
fmt.Println(sum(1, 2, 3)) // 6
fmt.Println(sum(10, 20)) // 30
fmt.Println(sum()) // 0Variadic внутри функции — это слайс
Параметр nums ...int внутри функции — обычный []int. Можно применять len, range, индексацию:
go
func describe(nums ...int) {
fmt.Printf("Получено %d аргументов: %v\n", len(nums), nums)
}Передача слайса через ...
Чтобы передать готовый слайс в variadic-функцию, используй ... после имени слайса:
go
numbers := []int{1, 2, 3, 4, 5}
fmt.Println(sum(numbers...)) // 15Это «разворачивает» слайс в отдельные аргументы. Без ... не скомпилируется:
go
sum(numbers) // ошибка: cannot use []int as intVariadic с другими параметрами
Variadic-параметр должен быть последним:
go
func log(prefix string, msgs ...string) {
for _, msg := range msgs {
fmt.Printf("[%s] %s\n", prefix, msg)
}
}
log("ERROR", "файл не найден", "нет доступа")fmt.Println и append
Самые известные variadic-функции стандартной библиотеки:
go
// fmt.Println принимает ...any
fmt.Println("a", "b", "c")
// append принимает ...T
s := []int{1, 2}
s = append(s, 3, 4, 5) // три новых элемента
s = append(s, []int{6, 7}...) // слайс через ...Пример: join строк
go
func join(sep string, parts ...string) string {
result := ""
for i, p := range parts {
if i > 0 {
result += sep
}
result += p
}
return result
}
fmt.Println(join(", ", "Go", "Python", "Rust")) // Go, Python, RustВ реальном коде используй strings.Join — он эффективнее. Но принцип тот же.
append — это variadic-функция. append(slice, a, b, c) и append(slice, other...) — оба варианта работают.
GOROUTINE STACK ↑ растёт вверх
main() начинается
Новый фрейм main() создан в стеке горутины
1 / 4
🎯
Миссия 1 из 3
Как объявить variadic-параметр типа int?