В ожидании Go 1.18
В этом выпуске дайджеста мы собрали много полезного: от дженериков до тестирования HTTP API и фаззинга. Хотите знать больше про разработку на Go? Тогда желаем приятного чтения.
Как правильно использовать дженерики в Go
В прошлом дайджесте мы мельком упоминали, что в этом году нас ждет самое существенное изменение языка за 12 лет — появление дженериков. Несмотря на широкое распространение обобщённых функций и классов в других языках, Go долго обходился без них. В итоге стало ясно, что писать много кода разработчикам не нравится. Это дало дженерикам зелёный свет.
Их использование должно значительно упростить жизнь разработчиков, позволяя реорганизовать код, используя обобщённые типы. Но применять их вообще во всех ситуациях неправильно. Это как забивать гвозди микроскопом. Почитайте вот эту статью, чтобы понять, когда дженерики действительно помогут написать хороший код, а когда от них стоит отказаться.
Иерархические структуры данных, такие как двоичные деревья — хороший пример правильного применения дженериков. С помощью них можно выделять тип элементов. Ну а если вы задействуете дженерики при простых вызовах методов, то это лишь усложнит код.
Если хотите быть early bird, можно использовать второе бета-превью Go 1.18. Всем остальным советуем дождаться релиза, в нем будет значительно меньше ошибок.
Проверяем сертификаты TLS на предмет отзыва
Когда приложению нужно проверить, действителен ли сертификат, применяются два протокола: OCSP и CRL. Первая аббревиатура расшифровывается как Online Certificate Status Protocol. Из названия становится ясно, что это интерактивный протокол, позволяющий сделать запрос в определенный сервис для проверки сертификата. Второй протокол, Certificate Revocation List, не интерактивен и всё реже применяется на практике. Чаще всего CRL выдается CA при отзыве, но может быть выдан и любым другим доверенным органом.
Так в чём же проблема? Golang в своем составе имеет поддержку TLS. Но когда начинаешь уточнять детали, то выясняется, что валидатора OCSP внезапно нет. Обсуждение о его интеграции продолжается, но можно ли реализовать валидацию уже сейчас? Ответ положительный.
Разработчики из Cossack Labs столкнулись с этой задачей и предложили свой вариант решения. С помощью функции обратного вызова VerifyPeerCertificate, после прохождения обычной проверки цепочки сертификатов, можно принять решение о продолжении соединения. Внедрить CRL было чуть проще, поскольку требовалось всего лишь с определенной периодичностью загружать файл и преобразовывать в структуру. Чтобы каждый раз не дергать CRL, можно применить кэширование.
Поддержка debugCall на arm64
ARM продолжает победоносно шагать по планете. Все больше и больше разработчиков делает выбор в пользу ARM-based компьютеров. Но, увы, новые технологии всегда несут за собой сложности. Одна из таких — отсутствие поддержки debugCall на архитектуре ARM. Нельзя сказать, что это востребованная функция, однако для многих она является привычным инструментом отладки.
В декабре 2020 года в репозитории Delve Debugger была описана проблема с отсутствием debugCall на linux/arm64. Тогда все ждали, что поддержка появится с версией 1.16. Но время шло, а эта функция так и не появилась. В этом году нас ждет выход Go версии 1.18. Увы, но в ней также не будет этой функции. Надеемся на следующую версию 1.19.
pact-go — Фреймворк для тестирования HTTP API
Стоит ли поджигать свой дом, чтобы проверить работу пожарной сигнализации? Очевидно, нет. Стоит ли использовать интеграционные тесты с использованием «боевых» развёрнутых приложений? Пожалуй, стоит обратить внимание на альтернативы — например, pact-go.
Его создатели решили пойти путём создания «пакта», то есть некоего контракта в котором прописываются ожидаемые запросы и ответы. Затем реальные приложения предоставляют свои фактические ответы. После сравнения ожидаемых данных с фактическими можно сделать вывод о корректности взаимодействия приложений друг с другом.
Во всех ли случаях это работает? Можно ли доверять такому способу тестирования? Ответ на эти вопросы будет неожиданным. Ничто не может гарантировать то, что смоделированное взаимодействие будет вести себя также, как и реальное. Но такой способ значительно быстрее, дешевле и удобнее, чем традиционные интеграционные тесты.
Основы фаззинга в Go
А что если… на вход приложения будет подана случайным образом сгенерированная мешанина символов? Что если приложение ожидает одни данные, а поступают другие? Будет ли нарушаться при этом внутренняя логика приложения? Этими вопросами рано или поздно задаются все разработчики и именно их решает проведение fuzzing-тестирования.
В ожидании выхода Go 1.18 мы можем пощупать две бета-версии, где фаззинг уже реализован. Начиная с Go 1.18 beta 1 появился новый флаг -fuzz, с помощью которого можно будет задействовать этот механизм тестирования. Лежит всё это добро в функции main и использует fmt, так что перед использованием следует выполнить стандартное объявление функции и импорт соответствующего пакета.
Проще всего начать изучение с туториала, опубликованного на официальном сайте проекта. Там есть детальные объяснения самого процесса и примеры использования. Отладка сбоев с помощью фаззинга — увлекательная головоломка, позволяющая оттачивать свои навыки и сразу писать хороший код.
Обучение
Курс Python в Evrone Academy
60 учебных модулей
Если вы думаете о смене работы или хотите стать частью нашей команды, но у вас недостаточно коммерческого опыта, то теперь можно учиться прямо в Evrone. А после — попасть к нам на оплачиваемую стажировку.
Основа обучения в Evrone Academy — наши высокие требования к разработчикам и опыт в проектах. Мы записали лекции, подготовили текстовые версии, добавили практические задания — это позволит вам подтянуть знания до middle-уровня. На стажировке мы дополним теорию практикой, а после — добро пожаловать на «боевой» проект.
Сейчас академия доступна в режиме early access — можно пройти базовые части по Python или Ruby. Но мы уже готовим новые материалы и практические задания, подписывайтесь на нас в соцсетях, чтобы не пропустить обновления!
Конкурсы для разработчиков
Ruby Quiz
до 28 февраля 2022
Хороший программист обычно знает несколько языков, так что предлагаем проверить себя в нашем новом квизе по языку Ruby.
Его составляли наши опытные разработчики, так что придётся хорошо подумать. Внутри семь вопросов и несколько вариантов ответов, из которых лишь один правильный. Среди тех, кто правильно ответит на все вопросы мы разыграем приятные призы: Apple AirPods Pro, Яндекс.Станцию и увлажнитель от Electrolux.
Митапы
GO meetup
20 апреля 2022 19:00
Рады сообщить, что у нас запланирован отличный Go Meetup, который пройдёт 20-го апреля. Детальная информация о мероприятии будет опубликована позже, следите за нашими новостями.
Вакансии
Удаленка / Офис
Evrone
Мы открыты для новых Go-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.
Не забывайте подписываться на наш дайджест, где вы будете регулярно находить полезные обзоры и новости мира разработки, а также добавляйте нашу RSS-ленту в свой любимый RSS-агрегатор, чтобы не пропустить выход новых материалов.