У меня есть что-то на java - но в шаре есть решения лучше/багаче.
Но можно же лучше, нормальный код, нормальную базу сделать. Почему нет? Современные реалии позволяют, где то взять spring boot, какая разница какой будет реализация? Смотря как считать, лучше/багаче, по реализации возможно, по коду есть сомнения, открыт же полный фарш и нормальными современными инструментами, как раз таки не повторять старых ошибок, заложить хорошую архитектуру.
Есть же kotlin к тому же и хоть 1 человек не любит его, называя "Еретическое ответвление богоподобной явы", но все равно, весьма тоже активный язык и тот же spring boot и не только на нём есть.
Я выбрал go потому что это компромис для меня.
Компромисс в чём? Архитектурно это всё решалось, выбирался язык под задачу, он очень пустой же
Есть много языков C++, Rust, C#, F#, Java(Kotlin), Elixir, Zig, Nim. Если знаком с java я пробовал бы kotlin
Что есть нормальный язык?
Который способен решать поставленные бизнес-задачи под то что он и разрабатывался, go этим похвастаться не может, это равноценно что взять си 70 годов и будет тот же уровень, только в разы лучше и обширнее. Можем взять современный си, все те же самые плюсы будут и так, что нам даст go по сравнению с си? Готовые библиотеки для реализации каких то макро-микросервисов с минимум бизнес логики, чуть посерьезнее уже не будет хватать.
По поводу ужаса с if err != nil я вот тоже не совсем уловил, визуально не нравится отсутствие сахара? оно ж явное и прозрачное для обработки, это ли не плюс?
На каждый if, процессор выполняет операции угадывания, это уже минус по производительности. Это проверка многословная и начинает раздражать на больших объёмах кода, потому что почти везде нужно писать один и тот же код if err != nil, соответственно разрастается бизнес логика, сложнее видеть доменную логику среди этих проверок, появляется copy paste одного и того же, что соответственно нарушает паттерн программирования DRY, потому что мы повторяемся).
Код:
a, err: = step1()
if err != nil {
return err
}
b, err: = step2(a)
if err != nil {
return err
}
c, err: = step3(b)
if err != nil {
return err
}
Ну вот что это?) А потом ты либо начинаешь это игнорировать, пропускать, надеяться, что все будет окей, а оказывается, что нет и это постоянно так. И если только сеть была бы на go ещё может быть да, но это же не только про сеть, а ещё:
Геодата
AI
Поиск пути
Скилы
Формулы
Синхронизации
Состояния
Эффекты
Переходы
Для сложного домена оперировать лишь структурами, интерфейсами, switch и рантайм проверками ну такое, начнётся свой колхоз, создания своих расширений к языку, доп либ и пакетов или существующих и тут будут проблемы, в этом можно утонуть, нужно думать глобальнее. А если сеть, то лучше Elixir вообще нет ничего и оперирует лишь он потоком данных. Да и создавался он как раз для абонентов сотовой связи изначально, плюс можно сразу в live режиме обновлять.
Или планируется реализация разных микросервисов?) Имеется тогда смысл делать на разных языках и разные сервисы в том где они хороши, это уж куда интереснее было бы и открыло бы куда больше возможностей.
Java по сути уже прошла тот самый путь и многие кейсы со сборщиком мусора и многие баги до сих пор ещё фиксятся с ним, но многие остановки и не только исправлены, а Go ещё проходит и как раз таки с ним будут проблемы и на механиках линейки это будет видно и потом на онлайне как он будет работать. Гарантированно паузы GC и особенно на большом онлайне будут видны, уже кстати проверено на 1 проекте tencent при 1к+ онлайне и одновременном выполнение действий видно было как летели ошибки и паузы сборщика мусора, а к ним добавится latency spikes и засорение памяти временными объектами. Java это уже всё это прошло и хоть внедрение фич очень долгое и пока комитет примет эту фичу в других языках она будет реализована. При этом появились весьма крутые фичи records, sealed classes, pattern matching, virtual threads и не только. Но C# лучше Java, но главный плюс они схожи и почему его было не взять? Шикарный DI, LINQ, Async/await к тому же в 9 в превью ввели ещё лучше async/await а в 10 уже вроде заменили на превьюшный, value types, source generator и структуры в разы сильнее гоушных, есть нативный AOT, Span, Memory, выделение стэка и куча крутых фич, особенно когда работаешь со спанами.
В цитате всё хорошо и прямо описано
Но Go и не для этого. Его ниша (ой, тут утверждали про тотальность/универсальность?) - сетевые сервисы с простой доменной логикой, где anemic model + процедурный стиль нормально работает. Проблема когда на Go пытаются писать сложный домен - получается месиво.
А ММО это как раз сложный домен)
Я не отговариваю от go, но говорю сразу проблемы будут и проблем будет не мало, а когда дело дойдёт до реализации различных механик все эти проблемы вылезут и как только это появится на онлайне, будут баги, проблемы и погружение в код, пока это пет-проект это одно, а когда это становится на онлайн это уже будет совсем другое.