Подземное хранилище гофера

23 мая 2022
go_05.png

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

Quacks like a duck

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

Автор статьи Of Ducks and Go Interface Misuse разобрал несколько примеров неправильного использования интерфейсов. По его мнению, будет ошибкой вообще отказаться от использования интерфейсов и задавать конкретные типы. В качестве примера он приводит написание библиотеки для поддержки облачного хранилища. 

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

Верное использование интерфейсов сразу даст преимущество. Это простота создания новых вариантов кода, к примеру, для тех же облачных провайдеров. Главное, чтобы реализация удовлетворяла уже существующему интерфейсу. Также упрощается задача тестирования и использования «заглушек» в модульных тестах.

Cloud-native God of War

Что нужно golang-разработчику для быстрой разработки приложения с нуля на микросервисной архитектуре? Правильно подобранный набор инструментов в стиле Swiss Army Knife — вот основа фреймворка Kratos. В качестве транспорта — HTTP/gRPC, а как middleware используется OpenTelemetry + Prometheus (по умолчанию). Такие компоненты, как Registry и Standart Log легко интегрируются со сторонними приложениями через систему плагинов. 

Можно указать несколько источников конфигурации. Они объединяются в map[string]interface{} и сохраняются в виде пары key/value. Для получения значений задействуются методы Scan или Value. Это позволяет легко менять конфигурацию на произвольную и перезагружать её «на горячую».

Для унификации логики сериализации/десериализации была создана абстракция в виде отдельного интерфейса Codec. «Из коробки» он поддерживает следующие форматы:

  • form
  • json
  • protobuf
  • xml
  • yaml

Примеры использования Codec есть в документации.

Работа с ошибками также весьма удобна. Определять ошибки можно непосредственно в protos, а генерировать код через плагин для компилятора protoc-gen-go. Помимо кода сбоя можно получать еще и человекочитаемую причину. Например, "code": 500"reason": "USER_NOT_FOUND".

Ну а на сладкое автоматическая генерация OpenAPI Swagger двумя способами. Первый — через установку swagger-api плагина в проект. Он создаст простой HTTP-сервер и даст доступ к API. Второй способ — через protoc плагин. Здесь есть возможность генерировать swagger.json для дальнейшего импорта.

Есть ли жизнь без ORM

Работа с базами данных в Go проста и самобытна. ORM применяется значительно реже, чем в других языках. Для взаимодействия используется стандартный пакет database/sql. Это простой набор интерфейсов, начинающий работать в паре с соответствующим драйвером. Но как только набора database/sql перестаёт хватать, возникает вопрос «а как расширить интерфейсы?». Здесь на сцене появляется sqlx.

Расширение добавляет много новых фич. Например, становится возможным управлять пулом соединений. Во-первых, есть вариант ограничить общий размер пула, задав их предельное количество. Во-вторых, можно указать максимальное время бездействия, по истечение которого соединение будет закрыто. Разумеется, следует быть очень внимательным и смотреть на реальную нагрузку. Помимо этого не стоит стесняться вызывать Rows.Close() даже там, где нет явной необходимости.

Помимо привычных Scan и StructScan расширение позволяет использовать Row и Rows для получения среза или карты с результатами. Это полезно, когда запросы выполняются от «третьей стороны» и нет представления, какие столбцы будут возвращены в ответ. Конечно, это лишь малая часть той семантики, которая добавится к стандартной. Полностью освоить возможности sqlx можно в иллюстрированном гайде на сайте проекта.

Анализ конфигов с go-zero

Большинство приложений используют конфигурационные файлы. Они бывают очень громоздкими, что затрудняет анализ и проверку. Их нужно упрощать. Для этого можно использовать фреймворк go-zero.

С помощью простого API формируется логика, а сам код генерируется с помощью goctl. Пример применения go-zero отлично разобран в статье Meet Go-zero — A Way to Define and Load Configuration From Files. В качестве формата используется yaml, позволяющий писать комментарии, а загрузка осуществляется через MustLoad. Создав скелет будущего конфигурационного файла, остальное можно отдать на откуп goctl. Полученный код будет соответствовать наиболее правильным инженерным практикам и сэкономит немало времени.

Митапы

Онлайн

Летний GO meetup

29 июня  2022 19:00

Рады сообщить, что у нас запланирован очередной Go Meetup, который пройдёт 29 июня . Детальная информация о мероприятии будет опубликована позже, следите за нашими новостями.

Регистрация

Обучение

Онлайн

Курс Python в Evrone Academy

60 учебных модулей 

Если вы думаете о смене работы или хотите стать частью нашей команды, но у вас недостаточно коммерческого опыта, то теперь можно учиться прямо в Evrone. А после — попасть к нам на оплачиваемую стажировку.

Основа обучения в Evrone Academy — наши высокие требования к разработчикам и опыт в проектах. Мы записали лекции, подготовили текстовые версии, добавили практические задания — это позволит вам подтянуть знания до middle-уровня. На стажировке мы дополним теорию практикой, а после — добро пожаловать на «боевой» проект.

Сейчас академия доступна в режиме early access — можно пройти базовые части по Python или Ruby. Но мы уже готовим новые материалы и практические задания, подписывайтесь на нас в соцсетях, чтобы не пропустить обновления!

Регистрация

Вакансии

Удаленка / Офис

Evrone 

Мы открыты для новых Go-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.

Подробнее

Подписаться
на Digest →
Важные новости и мероприятия без спама
Технологии которыми вы владеете и которые вам интересны
Ваш адрес электронной почты в безопасности - вот наша политика конфиденциальности.