Golang показался довольно интересным языком, чтобы его попробовать. Прежде всего меня интересует контекст серверной бизнес-логики. Обычные фреймворки в этой сфере: Spring, RubyOnRails, Django.
Сначала написал несколько небольших утил (например, UDP Sniffer). Потом бек-енд проект средней сложности (нет в публичном доступе). Для понимания размера: 14 http-endpoints, 1 из них graphql (там еще больше 30 запросов и мутаций), Postgres.
При этом некоторые вещи в платформе сильно импонируют:
- Серьезное отношение к стандартной библиотеке: ожидается, что для большинства случае будет она использоваться, а не что-то стороннее.
- Единый автоматический стиль форматирования.
- Генерируемый исполняемый файл содержит все основные зависимости.
- Эффективное использование железа, особенно при низких нагрузках. Та же Java может даже быстрее работать, но запустить ее быстро и на малом железе весьма тяжело (нативная компиляция и прочее).
- Легкая кросс-компиляция.
- Интересный подход к многопоточности.
- Интересный стиль синтаксиса.
- Быстрая сборка.
В итоге, главное что не понравилось – обработка ошибок. В мире бизнес-логики мы обычно ничего не можем поделать с техническими ошибками – обычно просто возвращаем ошибку на запрос и нужны логи, чтобы разобраться что произошло. При этом Golang, чтобы получился stacktrace, предполагает явную обработку на каждом уровне вызова. Получается, что код увеличивается где-то в 3 раза и ценности это не несет.
Основной список проблем:
- Обработка ошибок. Подробно см. выше.
- Все еще достаточно мало Golang-пограммистов и их тяжелее найти или обучить, чем на тот же Kotlin.
- Медленная сборка. Но она же быстрая? Если учитывать кодогенерацию, то получается заметно медленнее Spring… А кодогенерация из-за ограниченности самого языка. Впрочем, в будущем, думаю появится какой-то кеш для кодогенерации и будет отрабатывать моментально. Но не сейчас.
- Синтаксис недостаточно проработан – во многих случаях слишком многословен.
- Начиная с какого-то размера проекта есть ощущение, что рост кодовой базы дается тяжело, тяжелее Java/Kotlin.
В целом, для консольных утил и для сетевых серверов он весьма подходит. Т.е. как замена С/С++/Python(cli).