Юрий Белк – Full stack Developer (страница 21)
– `delve` (отладчик).
Go хорош тем, что «поставил Go – и почти всё уже есть». Это очень приятное чувство после миров, где нужно собрать пазл из 12 инструментов.
4.3. Плюсы Go
Плюс 1. Простота языка и предсказуемость
Go специально ограничивали по фичам, чтобы:
– код читался одинаково в разных командах,
– стиль был более-менее единым,
– поведение было понятным без «магии».
Поначалу кажется: «а где мои любимые фишки?»
Потом начинаешь ценить: «о, тут сложно написать слишком хитро».
Практический эффект:
– проще ревьюить код,
– проще онбордить людей,
– меньше «архитектурных религий» внутри команды.
Go как будто говорит: «давайте решим задачу, а не устроим конкурс абстракций».
Плюс 2. Быстрые бинарники и низкое потребление ресурсов
Go компилируется в один бинарник. Это даёт:
– простой деплой (особенно в контейнерах),
– меньше проблем с окружением,
– быстрый старт сервиса,
– хорошую эффективность по памяти и CPU (обычно).
Для платформенных команд это почти музыка:
– один файл,
– понятная конфигурация,
– легко катать в Kubernetes,
– быстро поднимать новые инстансы.
Если у вас много микросервисов, это ощущается особенно сильно: меньше инфраструктурной «возни».
Плюс 3. Отличная конкурентность: goroutines и каналы
Go создавался с мыслью, что сетевой сервер – это история про параллельность.
goroutines – очень лёгкие «зелёные потоки», которые Go runtime планирует сам.
В итоге вы можете:
– держать много одновременных соединений,
– параллелить I/O операции,
– строить пайплайны обработки.
Это не означает, что багов конкурентности не будет. Будут, конечно. Но модель проще, чем ручная работа с потоками во многих языках.
Часто Go выбирают именно за эту «естественность» конкурентного кода: сделал `go func()` – и задача поехала параллельно.
Плюс 4. Идеален для сетевых сервисов, инфраструктуры, high-load API
Go отлично показывает себя там, где нужно:
– много сетевых запросов,
– простая и быстрая обработка,
– низкие задержки,
– предсказуемость,
– эффективность на сервере.
Поэтому Go часто встречается:
– в API-шлюзах,
– в сервисах авторизации,
– в обработке событий,
– в инфраструктурных компонентах,
– в высоконагруженных микросервисах.
4.4. Минусы Go
Минус 1. Меньше «встроенной выразительности» для доменной логики (чем в Java)
Если доменная область сложная: много правил, много сущностей, много вариаций поведения – Java с её объектной моделью и типами иногда выражает такие вещи удобнее.
Go чаще тянет к стилю:
– простые структуры,
– явные функции,
– минимум «магии».
Это хорошо для инфраструктуры, но в сложной доменной логике вы можете столкнуться с тем, что:
– код начинает расползаться по функциям,
– появляются самодельные паттерны,
– хочется более богатой типовой системы «из коробки».
Это не «Go плох», это просто другой стиль. Но этот стиль подходит не всем доменам.
Минус 2. ORM/генерации/валидации – нужно выбирать аккуратно
В Go есть инструменты для:
– ORM,
– миграций,