0Pricing
Go Academy · Урок

Функции с переменным числом аргументов

Принимайте переменное количество аргументов

«Функции с переменным числом аргументов» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Что такое вариативная функция

Вариативная функция принимает ноль или более аргументов указанного типа, собранных в срез:

func sum(nums ...int) int {
    total := 0
    for _, n := range nums {
        total += n
    }
    return total
}

fmt.Println(sum(1, 2, 3, 4)) // 10

Синтаксис ...T

Используйте ...T как тип последнего параметра. Внутри функции это []T:

  • Функцию можно вызвать с нулём или большим количеством аргументов
  • Вариативный параметр должен быть последним
  • В каждой функции может быть только один вариативный параметр

Раскрытие среза

Передайте существующий срез в вариативную функцию с помощью оператора раскрытия ...:

nums := []int{1, 2, 3, 4, 5}
total := sum(nums...)  // spread the slice
fmt.Println(total)     // 15

Функция fmt.Println является вариативной

Многие функции стандартной библиотеки являются вариативными. fmt.Println имеет сигнатуру func Println(a ...interface{}) (n int, err error) — она принимает любое количество значений любого типа.

Функция добавления является вариативной

Встроенная функция append является вариативной:

a := []int{1, 2, 3}
b := []int{4, 5, 6}
a = append(a, b...)   // append all of b into a
fmt.Println(a)         // [1 2 3 4 5 6]

Вариативная функция с другими параметрами

Вариативные параметры идут последними. Сочетайте фиксированные и вариативные параметры:

func logf(level string, msg string, args ...interface{}) {
    fmt.Printf("[%s] "+msg+"\n", append([]interface{}{level}, args...)...)
}

Вызов вариативной функции без аргументов

Вариативную функцию можно вызвать без аргументов — срез будет нулевым или пустым:

fmt.Println(sum())   // 0 — nil slice, loop runs 0 times

Вариативный параметр или параметр-срез

Когда использовать вариативный параметр, а когда — параметр-срез:

  • Вариативный параметр: когда вызывающая сторона передаёт отдельные значения непосредственно в вызове (например, sum(1,2,3))
  • Срез: когда у вызывающей стороны уже есть готовая коллекция
  • Вариативный параметр удобнее в местах вызова; внутри функции оба варианта работают одинаково хорошо

Передача вариативных аргументов другой вариативной функции

Передавайте вариативные аргументы дальше с помощью раскрытия:

func logError(args ...interface{}) {
    log.Println(args...) // forward to log.Println
}

Создание шаблонов параметров

Вариативный параметр ...Option — популярный шаблон для необязательной конфигурации (функциональные параметры):

type Option func(*Server)

func NewServer(addr string, opts ...Option) *Server {
    s := &Server{addr: addr}
    for _, o := range opts {
        o(s)
    }
    return s
}

Быстрая проверка

Как передать срез в вариативную функцию?

Итоги: вариативные функции

Вариативные функции делают места вызова лаконичными:

  • ...T собирает конечные аргументы в []T внутри функции
  • Функцию можно вызвать с отдельными значениями или раскрыть срез с помощью slice...
  • Встроенные функции, такие как append и fmt.Println, являются вариативными
  • Разрешён только один вариативный параметр, и он должен быть последним
  • Используйте шаблон функциональных параметров для выразительного проектирования интерфейсов

Далее: defer, анонимные функции и замыкания.

Часто задаваемые вопросы

Урок «Функции с переменным числом аргументов» бесплатный?

Да — полный текст урока «Функции с переменным числом аргументов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Функции с переменным числом аргументов»?

Принимайте переменное количество аргументов Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Функции с переменным числом аргументов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы функций и сигнатуры
  2. Несколько возвращаемых значений
  3. Функции с переменным числом аргументов
  4. defer, анонимные функции и замыкания
← Назад к Go Academy