Один год Go в продакшене. Итоги.

Прошел год, как я пишу на Go больше всего кода (относительно других языков программирования) в своей работе. Хочу описать впечатления от моего опыта.

The Good

Я люблю Go. В среднем, большая часть вещей мне нравится, и я не испытываю каких-либо проблем при работе с данным языком. Особенно нравится:

  • Туллинг. В go много как встроенного туллинга (будь то для тестирования, или бенчмарков), так и замечательная поддержка сторонего софта (Vim, LSP, GoLand, Cloud SKDs, etc.)
  • Код везде одинаковый. За счет строгих линтеров и кодстайлов, когда ты открываешь новый проект, ты видишь уже знакомый тебе код. Это очень упрощает онбординг на новые проекты.
  • Много материалов для обучения, в том числе про низкоуровневые вещи, если хочется написать более производительный код.
  • Нет каких-то странных языковых абстракций, или сахара. Хотя Go имеет рантайм, и это высокоуровневый язык программирования с GС, нет ощущения какой-то темной магии при работе. Если надо, можно писать код, в котором будет понятно на что тратится каждый байтик памяти.
  • Хорошая поддержка конкурентого и/или асинхронного программирования. Возможно, можно делать эти вещи немного лучше, имея Structured concurrency, или возможность написания своего рантайма для запуска рутин (что помогло бы для Simulation testing), но в целом текущая реализация закрывает большинство задач.
  • Отличная интеграция с CNCF (Cloud native) проектами. Если нужно написать расширение для Kubernetes, или чего-то из этой области, на Go это будет довольно просто, так как большинство CNCF продуктов написаны на Go.
  • Interfaces. Go использует structural typing. Это другая концепция работы с интерфейсами, не привычная для Java и C#. В Go потребители (consumers) определяют набор методов, которые им нужны. Клиент этого кода имеет право передать любую структуру, которая реализует эти методы. Это невероятно сильно помогает расширять код, меняя его поведение. Также такой подход значительно упрощает написание тестов.
  • Жоские гарантие обратной совместимости языка. Вы просто повышаете версию Go в вашем проекте на новую, и ожидается, что всё продолжит работать, как и ранее (практически всегда, исключения описаны в документации).

The Bad

Я, наверное, могу придумать только пару пунктов в Bad-секции.

Моя самая главная боль в Go — это отсутствие полноценных Enum (sum types). Я бы хотел иметь возможно описать какой-то енам, а потом попросить компилятор проверить, что я обработал все возможые значения этого перечисления (switch exhaustive). Вместо этого мы вынуждены симулировать енамы через iota, и добавлять default секцию с ошибкой в каждый switch. Есть обсуждение этой фичи — https://github.com/golang/go/issues/28987 — но вряд ли она будет реализована.

Второй Bad немного спорный, я не знаю проблема это для меня ли нет. Во многих языках есть возможность обработать коллекции элементов в более функциональном стиле (примеры — C# Linq, или Java Streams). В go этот код получается более вербозным, даже если нам просто надо сделать filter/map. Это и плохо, и хорошо. Плохо — больше кода, легче ошибиться. Хорошо — код более простой, любой человек сможет его понять.

The Ugly

У меня пока нет ничего в Ugly относительно Go.

Итоги.

Из моего списка можно понять, что я сильно полюбил Go за последний год (это не мой первый проект на Go, но прошлый я писал много лет назад). Любой язык имеет пространство для улучшения (в Go это может быть перфоманс рантайма, включая GC). Но в целом, если вам нужно писать что-то для Кубера, или Клауд Нейтива, или просто какое-то Rest/gRPC API — вы можете смело брать Go.

Категории: Программирование