Испытание медными трубами

Привет, гоферы! Сегодня взглянем на проблему обратной совместимости и кроссплатформенной разработки с помощью Go. Также расскажем про неоднозначный фреймворк Beego и корректный подход к завершению работы приложения.
Graceful Shutdown
О graceful shutdown и hard shutdown мы чаще всего слышим в контексте операционных систем. Первое можно назвать плавным завершением работы: все исполняемые приложения корректно закрываются и только после этого ОС завершает работу. Второе же можно назвать принудительным выключением: ОС прекращает работу вне зависимости от того, успели запущенные приложения завершиться штатно или нет.
Golang в этом похож на операционную систему. Здесь тоже есть необходимость корректно завершать работу запущенных задач до отключения приложения. Благо язык предоставляет инструменты, позволяющие отслеживать и обрабатывать сигналы завершения работы от ОС. В стандартной библиотеке есть пакет Context.
Начать стоит с туториала How To Use Contexts in Go от DigitalOcean. Из него вы узнаете, какие функции и методы можно использовать для реализации плавного завершения задач. context.Background создаёт новый контекст на каждый новый процесс. А метод Done() интерфейса Context вместе с фунцией context.WithCancel помогает корректно завершить работу контекста.
Чтобы взаимодействовать с сигналами завершения от ОС, потребуется пакет os/signal. Он также входит в стандартную библиотеку языка и реализует доступ к входящим сигналам ОС. Стоит помнить, что поведение в UNIX-подобных ОС будет отличаться от поведения в Windows или Plan 9.
Кроссплатформенность с Fyne
В нашем дайджесте по Flutter мы не раз отмечали удобство кроссплатформенной разработки. Единая кодовая база для мобильного и десктопного приложения делают жизнь разработчика проще. Но не только Dart может этим похвастаться. У Golang припрятан козырь в рукаве — Fyne.
Это простая библиотека, позволяющая создавать программы с графическим интерфейсом на Go. Вместе с кросс-компилятором fyne-cross они позволяют собрать приложение почти под любую операционную систему и архитектуру. Обольщаться не стоит — там есть нюансы, которые не дают возможности работы сходу, «из коробки». Но и ничего сложного тоже нет, но без установленного докера адекватно не работает.
Вот так будет выглядеть Helloworld, написанный с помощью Fyne:
package main
import (
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
)
func main() {
a := app.New()
w := a.NewWindow("Hello")
hello := widget.NewLabel("Hello Fyne!")
w.SetContent(container.NewVBox(
hello,
widget.NewButton("Hi!", func() {
hello.SetText("Welcome :)")
}),
))
w.ShowAndRun()
}
Этот пример можно запустить как обычно через go run main.go или в режиме симуляции мобильного устройства go run -tags mobile main.go.
Заинтересовали? Тогда обязательно прочитайте статью на Хабре Golang fyne Куда нажать? :-(, где автор подробно описывает свой опыт создания приложений на Fyne. Отдельно отметим, что кроме статьи автор составил краткий гайд по кросс-компиляции.
Go и обратная совместимость
Какое профессиональное сообщество без холивара? Вот и о тему обратной совместимости было сломано немало копий в попытках доказать жизнеспособность той или иной идеи.
Сохранение обратной совместимости — один из приоритетов индустрии, ведь это позволяет сохранить функционирование существующих систем. Людям в этом случае не нужно переучиваться или серьезно менять подход к привычной деятельности.
С другой точки зрения, сохранение обратной совместимости предполагает сдерживание развития и требует немалых ресурсов. Поддержка старых архитектур и протоколов ставит массу ограничений и часто является недостижимым препятствием на пути прогресса.
Развитие языка за последний год показало существенные преобразования в плане переделки архитектуры. Теперь в языке есть дженерики, появился фаззинг и в планах внедрение PGO (Profile-guided optimization). В сообществе закономерно начались обсуждения и таких важных вещей, как обратная совместимость.
Часть мейнтейнеров Golang указывают, что их цель — достижение полной обратной совместимости с первой версией языка. Это означает большую стабильность для конечных пользователей и задекларировано в документации. Исключения — исправления ошибок и ситуации с нарушением безопасности.
Есть и другая, альтернативная точка зрения. Мы видим немало примеров, когда выбор, сделанный в пользу прогресса, и отказ от обратной совместимости позволил добиться хороших результатов. Так Python 3 обзавёлся массой новых функций, код стало удобнее читать и воспринимать. Судя по рейтингам, языку это пошло на пользу.
Ждут ли нас глобальные изменения в Golang — покажет время. А пока можно спокойно обдумать всё вышесказанное, а возможно и поделиться своим мнением с коммьюнити.
Фреймворк Beego
В нашем дайджесте мы всегда стараемся рассказывать о самых разных инструментах разработки, даже о неоднозначных. Например, привычную для многих MVC-архитектуру попытались запихнуть в Go. Результатом стали такие фреймворки, как Revel и Beego. О последнем и расскажем чуть подробнее.
Tornado, Sinatra и Flask — именно они стали источником вдохновения для автора фреймворка. С помощью Beego можно создавать RESTful API, веб-приложения и серверные службы. Используется принцип «battery included» в отличие от того же Gingonic, то есть в фреймворке есть все необходимые инструменты.
Казалось бы, отличная идея совместить скорость и удобство языка с архитектурой MVC. Но реализация получилось неоднозначной. Многие разработчики, часто критикуют Beego из-за активного использования практик, давно ставших в Go антипаттернами, сложности тестирования и частого возникновения побочных эффектов. Да и создавался Beego во времена, когда о дженериках речи не шло.
Итого — можно писать full-stack приложения на Go, используя MVC-архитектуру. Но надо ли?
Подкасты
Немного IT
Видеоподкаст про Go снимают и развивают двое наших коллег из Evrone. Они обсуждают его преимущества и недостатки, сравнивают с другими языками.
Выпуски длятся 50-70 минут, а значит можно совместить какие-нибудь скучные занятия с обучением. Включайте шумоподавление на наушниках, чтобы не слышать пылесос, и погружайтесь в нюансы Go! Ну а если вам есть что сказать — добро пожаловать в комментарии!
Митапы
Осенний Go Meetup
19 октября 2022
Рады сообщить, что уже сегодня вечером состоится Go Meetup. Нас ждут интереснейшие доклады спикеров:
- Антон Губарев (Авито) — «Реализация ролевой системы доступа с помощью Open Policy Agent».
- Николай Тузов (Lamoda) — «Внутреннее устройство каналов в Go».
- Андрей Беренда (Ozon Fintech) — «Ошибки, которые нельзя обработать в Golang».
Ещё не поздно зарегистрироваться и принять участие в мероприятии.
Вакансии
Evrone
Мы открыты для новых Go-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.