Освоение функций с переменным числом аргументов в Go With With
Variadic Functions in Golang - The power of with()

Освоение функций с переменным числом аргументов в Go With With

Эта статья была переведена с английского языка автоматически с помощью средств машинного перевода и может содержать неточности. Подробнее
См. оригинал

В Go функции с переменным числом аргументов часто вводятся с помощью fmt. Печать() или сумма() Примеры. Но в Реальные проекты, одним из наиболее мощных применений функций с переменным числом аргументов является метод Шаблон функциональных опций — с помощью With() Помощники стиля для создания объектов.

Этот шаблон позволяет вашим конструкторам:

  • Более читабельный
  • Проще в продлении
  • Безопаснее благодаря встроенной проверке


Что такое функция с переменным числом аргументов в Go?

Функция с переменным числом аргументов — это функция, которая принимает переменное количество аргументов. Вы определяете его с помощью метода многоточие (...) перед типом последнего параметра.

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

fmt.Println(sum(1, 2, 3)) // 6
fmt.Println(sum(1,2))     // 3        

В данном случае цифры — это срез ([]int), что обеспечивает гибкость в выборе количества передаваемых аргументов.


Использование в реальной жизни: функциональные возможности с помощью With()

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

Сначала создать свой HTTP-клиент было просто:

NewClient("https://api.example.com")        

Но по мере того, как требования накапливаются, ваш конструктор начинает раздувать:

  • Вам нужен базовый URL.
  • Вы добавляете Времени ожидания.
  • Вы проходите Токен API для аутентификации.
  • Вы вбрасываете Количество повторных попыток для надежности.
  • Может быть, пользовательский транспорт HTTP для поддержки прокси.

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

NewClient("https://api.example.com", 5*time.Second, "Bearer token", nil, true, 3)        

На первый взгляд... Что вообще означают эти параметры?

  • Является ли nil для заголовков или пользовательским транспортом?
  • Является ли true включением повторных попыток или отладки?
  • Что будет, если добавить еще один параметр посередине?

Это все равно, что пытаться собрать мебель ИКЕА без инструкции — все детали на месте, но вы постоянно листаете руководство, чтобы вспомнить, куда идет каждая из них.


Решение

А теперь представьте себе Рефакторинг это с помощью команды With() Шаблон функциональных опций. Ваш клиент настроен внезапно читается как предложение:

client := NewClient(
    WithBaseURL("https://api.example.com"),
    WithTimeout(5*time.Second),
    WithHeader("Authorization", "Bearer token"),
)        

Больше никаких догадок:

  • Самодокументирование — Каждый вариант точно говорит вам, что он делает.
  • Не зависит от заказа — Смешивайте и сочетайте, ничего не ломая.
  • Перспективность — Добавьте новый WithRetries(3) не затрагивая существующий код.

Речь идет не только о более чистом коде, но и о том, чтобы код, который ощущается как разговор, где вы можете прочитать настройку и мгновенно понять намерение, не выискивая сигнатуру функции.

🔗 Хотите увидеть полный рабочий пример?

👉 Посмотреть полный код на GitHub


Преимущества и ограничения вариадической функции

Плюсы

  • Более понятные и читаемые конструкторы
  • Поддерживает необязательные аргументы без нескольких функций
  • Простое продление без прерывания существующих вызовов
  • Возможность проверки для каждого варианта

Минусы

  • Небольшие накладные расходы из-за выделения дополнительных ломтиков
  • Может быть использован не по назначению, если добавить слишком много опций без структуры


Рекомендации

  1. Параметр variadic оставьте в поле конец конструктора.
  2. Сделайте каждый с() Автономный и проверенный.
  3. Избегайте дампа всей логики в New... — пусть каждый вариант обрабатывает свое поле.
  4. Документ доступен с() варианты понятны другим разработчикам.


Заключение

Вариативные функции в Го — это гораздо больше, чем трюк новичка. При сопряжении с функцией С() функциональный шаблон опций, они становятся Мощный инструмент проектирования для создания удобных в обслуживании, масштабируемых и чистых API Go.

🔗 Хотите увидеть полный рабочий пример? Я создал Репозиторий GitHub Демонстрируя:

  • HTTP-клиент с повторными попытками
  • Работа с сертификатами TLS
  • GET & POST запросы с пользовательскими заголовками

👉 Посмотреть полный код на GitHub

💬 Вы использовали С() в ваших проектах Go? Поделитесь своим опытом в комментариях!


Чтобы просмотреть или добавить комментарий, выполните вход

Другие статьи участника Aslam Mulla

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