Шаблоны разработки Go

3 разных способа использования функций в качестве значений в Go

Получите некоторые функциональные приемы в наших проектах Go

Go — статически типизированный компилируемый язык. Это похоже на любой другой язык со статической типизацией, но с меньшими усилиями и очень просто. Когда дело доходит до функционального стиля программирования, он не страдает таким многословием, как Java.

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

Здесь, в этом посте, я расскажу о 3 способах кодирования в Go.

ПО промежуточного слоя

Из всех способов мне больше всего нравится этот — популярный шаблон обработчика. Давайте посмотрим на это в действии.

Ниже мы создаем наш обработчик для работы в приложении. Функция соответствует интерфейсу the http.Handler:

Мы также создаем еще несколько промежуточных обработчиков/промежуточного программного обеспечения для решения сквозных проблем, таких как аутентификация и регистрация других работ:

Наконец, в основной функции мы создаем ultimateHandler, которая будет выполняться после того, как все задачи, такие как ведение журнала и аутентификация, будут выполнены для каждого запроса. Для этого мы соединяем несколько обработчиков в строке 5:

По сути, когда мы создаем переменную с http.HandlerFunc, мы создаем оболочку. Когда ему будет отправлена ​​функция, она будет вызываться сама.

Динамическая функция

Это еще один шаблон, который я люблю использовать в своем коде, когда это возможно. Это может выглядеть как шаблон Java для создания функциональных классов или потокового API. Но мы также можем использовать этот стиль кодирования с минимальным объемом кода и меньшей сложностью:

Анализ

  • В строке 8 мы определяем тип (UnaryFunction, функция, которая принимает 1 аргумент) функции, которая принимает int и возвращает другое целое число. Определив это, мы можем создать любой другой тип, который может соответствовать его структуре, а благодаря утиной типизации мы можем добиться динамической функции в Golang.
  • Строки 18 и 19 определяют две функции, соответствующие функции, определенной в строке 8, но с другой реализацией. Строка 18 реализует метод square, а строка 19 реализует cubing.

Общий код

Мы можем использовать замыкания, чтобы написать общий код на Golang. Рассмотрим этот код:

Давайте проанализируем:

  • У нас есть две службы: SubscriberDetailsService и SubscribeEntitlementService, которые возвращают тип ServiceCallback.
  • Эти ServiceCallbacks можно обрабатывать отдельно или с помощью балансировщика нагрузки и планировщика заданий, например rio.

В нашем примере обратные вызовы службы могут быть вызваны в любом месте, но когда они вызываются, они дают родительскому объекту контроль над механизмом вызова, и, поскольку они имеют один и тот же тип (ServiceCallback), их можно собирать, приоритезировать или сериализовать как разработчик хочет.

Вот и все. Спасибо за прочтение.

Мой очередной пост на Голанге