Модуль
1Основы функций2Variadic-функции← вы здесь3Замыкания4defer и panic/recover
Урок 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())              // 0

Variadic внутри функции — это слайс

Параметр 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 int

Variadic с другими параметрами

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...) — оба варианта работают.
func add(a, b int) int {
    return a + b
}

func main() {
    x := add(3, 4)
    fmt.Println(x)
}
GOROUTINE STACK ↑ растёт вверх
main()▶ ACTIVE
x=?
main() начинается

Новый фрейм main() создан в стеке горутины

1 / 4
🎯
Миссия 1 из 3
Как объявить variadic-параметр типа int?