На моих трансляциях лайв-кодинга постоянно всплывает этот вопрос. Проговаривал много раз, но если записать ответ, то дальше можно просто выдавать ссылку.

Кодить начал в 1995-ом на Delphi для автоматизации каталога компьютерных комплектующих. Я был успешным менеджером оптовых и дилерских продаж в системном интеграторе, но занимался любимым делом всё свободное время. Накопил два чемодана книжек по программированию. И повторял, что вместо выписывания счетов-фактур, я стану разработчиком. Первые веб-проекты поставили вопрос про хайлоад, сохранилась публикация в журнале Компьютер-Пресс, которая была перепечатана из интернетов в 2000-ом. Тогда же товарищ показал PHP, который меня очаровал. Ты решаешь прикладные задачи, остальное спрятано под капотом. Зачем я это рассказываю?

На 12 лет PHP стал основным инструментом моей новой профессии вебмастера. Хайлоад на чистом PHP и с применением демонов на C через интерфейс memcached. Но это был вертикально масштабируемый хайлоад. На конференциях рекламировали, что есть другой более эффективный путь - горизонтально масштабируемый хайлоад. Асинхроннная модель цикла событий в NodeJS обещала, что можно брать больше и кидать дальше. Хорошо, ещё 5 лет потрачено, пока не попробовал Golang. И это уже 2017-ый (надо было раньше). Божечки мои! Переход с NodeJS на Go - такой же кайф, как после Delphi на PHP. Ты снова решаешь прикладные задачи без лишних забот.

Вот он, настоящий горизонтально масштабируемый хайлоад. Горутины и каналы - это же элементарно, Ватсон. Ненавязчивая типизация, в сравнении с TypeScript. Отказ от фреймворков, подтверждённый развитой базовой библиотекой. Очень быстрый старт. Хотя простота обманчива, конечно. Собрал под 300 секретов на сегодня, это не предел. И я много раз видел, что большие легаси-системы на PHP и NodeJS применяют Go для удаления узких мест в хайлоад. Микросервисный подход решает самый главный вопрос - как управлять сложностью системы. Немного пугает воинствующая секта свидетелей идеоматичности. Другая крайность - появляются фреймворки, например Goravel. Но пока не вижу такого засилия, как Laravel и NestJS в экосистемах PHP и NodeJS.


Посмотрите на мой прекрасный проект для портфолио (архитектура из ОЗОНа с правильным покрытием тестами).

Комментарии (38)


  1. Isma
    04.11.2025 20:39

    Плюсую. Такой же путь. Чтобы понять - надо пройти. Уже 5 лет в Golang. И в отличие от предыдущих стеков - до сих пор не воткнулся в задачу, где надо тянуть другие технологии. А в том же PHP не единожды приходилось в узких местах использовать что-то другое.


    1. WLMike
      04.11.2025 20:39

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


      1. sdramare
        04.11.2025 20:39

        k8s это перекладывание json? Прометеус/графана/терраформ? cockroach db?


      1. comerc Автор
        04.11.2025 20:39

        Так мы же про профессию вебмастера, а не вот это всё.


    1. ForestDront
      04.11.2025 20:39

      Десктопное ПО и мобилы не может


  1. BOOTLOADER
    04.11.2025 20:39

    Go хороший язык для небольших сервисов и реализация параллелизма наверно лучшее из всего (особенно после того, как ты написал сто миллионов async/await в С# или typescript), но недостаток инструментария все равно часто напрягает.


    1. comerc Автор
      04.11.2025 20:39

      А в чём недостаток?


    1. user-book
      04.11.2025 20:39

      недостаток инструментария? В го?

      Тот самый го который можно скомпилировать под что угодно, без головняка и эльфийского делать вставки из других языков или и вовсе подключать целые либы?

      Тот самый Го в котором НОРМАЛЬНО построенная система либ (модулей) ?

      Мы точно говорим про тот самый Го в котором тесты и бенчмарки перестали быть своим отдельным миром?


      1. cmyser
        04.11.2025 20:39

        Json в excel попробуйте конветнуть )

        Нет общей либы конвертации, приходится писать болейплейт, да ещё и поддерживать его

        В других языках ставишь либу, вызываешь функцию

        Модули в го могут называться одинаково и после этого начинаются танцы с бубном


        1. user-book
          04.11.2025 20:39

          ну так это особенности статической типизации. можно все как map[string]any распарсить "в лоб" и с ним работать если прям горит, но по уму таки работать с четкими структурами данных

          а за модули вообще смешно - ты можешь сам при инициализации указать какое удобно имя или вообще "прилинковать" напрямую. Даже если у тебя будет 10 одинаковых имен модулей, работать с ними ты будешь так как назовешь без каких либо жестких привязок или конфликта имен


        1. MyraJKee
          04.11.2025 20:39

          Модули в го могут называться одинаково и после этого начинаются танцы с бубном

          Ответить cmyser

          Это не то чтобы прям так уж критично, есть же алиасы.


        1. pav5000
          04.11.2025 20:39

          В чем проблема с конвертацией? Подключаем пакет encoding/json, подключаем пакет для работы с экселем, перекладываем данные тем способом, который требуется. Все как в любом другом языке.


    1. hello_my_name_is_dany
      04.11.2025 20:39

      особенно после того, как ты написал сто миллионов async/await в С# или typescript

      особенно классно узнавать, что какая-то функция работает асинхронно без единого намёка на это


  1. Ru6aKa
    04.11.2025 20:39

    Go отличный язык для своей ниши, но есть нюансы. Если допустить что любой ЯП синтаксис+runtime+toolchain+stdlib имеет константную сложность, то у Go вся сложность перенесена в toolchain, в результате этого получаеться очень простой язык, но очень сложная обвязка вокруг него. Вот как пример https://golangci-lint.run/docs/linters/, 112 литеров это мягко говоря перебор. В Rust например ситуация кардинально противоположная, вся сложность перенесена в компилятор.
    И как только дело касается soft real time или hard real time, то Go просто не подходит.


    1. comerc Автор
      04.11.2025 20:39

      Линтеров больше, вот ещё: https://revive.run/r

      Я и сам добавил парочку:
      https://github.com/unused-interface-methods/unused-interface-methods
      https://github.com/error-log-or-return/error-log-or-return


      Мне нравится, что бьют по рукам линейкой, только когда попрошу.


  1. AbitLogic
    04.11.2025 20:39

    Если человек не осилил Rust, то почему бы и не побаловаться с гошечкой, не осуждаем


    1. megadrugo2009
      04.11.2025 20:39

      Вакансий на Rust сейчас существенно меньше. Всем нужен Golang.


      1. AbitLogic
        04.11.2025 20:39

        Ну это другой вопрос, я варюсь в embedded, нам тут отродясь go не нужен был, но если есть возможность 90% бюджета вкладывать в девайсы с кучей ОЗУ, почему бы не побаловаться гошечкой....


        1. sdramare
          04.11.2025 20:39

          "фиг знает зачем вам эта бмв, я вот работаю на стройке водителем катка и нам тут отродясь легковые автомобили были не нужны"


    1. sdramare
      04.11.2025 20:39

      раст не нужен, не зачем его осиливать.


    1. comerc Автор
      04.11.2025 20:39

      А кто тогда напихал минусов? Из лагерей PHP & NodeJS, вероятно. Шучу.

      Я за любой кипиш, кроме голодовки. Пробовал и Rust, но у него же другое применение. А для профессии вебмастера - Go лучший, по моим ощущениям.


  1. FireWind
    04.11.2025 20:39

    Коллеги, пожалуйста, поделитесь мудростью: работая под Win в IDE (условно, Goland) как проще всего делать готовый исполняемый файл не только под Win, но и сразу под Linux? Т.е. сразу две сборки под разные системы?


    1. strelkove
      04.11.2025 20:39

      А зачем делать готовый исполняемый файл в IDE? Как будто для таких целей должен быть пайплайн настроен в каком-нибудь гитлабе.


      1. FireWind
        04.11.2025 20:39

        Приватный, бесплатный план на github. С action так не получится. Вот и мудрю, как решить этот вопрос наиболее простым и не геморным способом. Может быть через контейнер докер как то сделать генерацию под Linux


        1. user-book
          04.11.2025 20:39

          все получится, просто в настройках репы надо разрешить что бы actions имел права

          https://github.com/voluminor/scripts-for-integration вот держите если надо с примерами, не так давно вычесал в очередной раз гитхаб. По ссылке в целом автоматизация, вам же надо чисто actions с тем как его можно "готовить"


        1. strelkove
          04.11.2025 20:39

          Может быть через контейнер докер как то сделать генерацию под Linux

          Или в wsl собирать


    1. user-book
      04.11.2025 20:39

      сделать build с нужными параметрами если "в лоб". По красоте обернуть в контейнеры что бы собирало в той же ОС что бы не было сюрпризов

      вообще из личной практики такое у меня собирается на стороне Ci/Cd в гитхабе с тестами, генераторами и тд. То есть по матрице паплайн на разные ОС и уже четко под ними пробегают тесты и если ок собираются (потому как могут быть мелкие подводные)


    1. pav5000
      04.11.2025 20:39

      Если не используете CGO в проекте, то выставить две переменные окружения, отвечающие за архитектуру и ОС и запустить сборку

      GOOS=linux GOARCH=amd64 go build -o myprogram_linux

      Если CGO используется, то собирайте в локальном докер-контейнере, сделайте в мейкфайле, например, таргет для этого (или в любой другой системе запуска скриптов, которая вам удобна).


    1. comerc Автор
      04.11.2025 20:39

  1. evgeniy_kudinov
    04.11.2025 20:39

    Почему автору поставили минусы? Возможно, «я пиарюсь» было бы более подходящим тегом статьи.

    Думаю, автору стоило бы рассказать о «300 секретах»: как он их создавал с помощью LLM. Мне и другим читателям было бы интересно об этом узнать.

    Бегло глянул проект https://github.com/comerc/budva43. На мой взгляд и субъективный, впечатление, что нет понятной принятой в Go структуры проектов, как, например, https://github.com/golang-standards/project-layout, и на первый взгляд выглядит как беспорядочные папки и с проблемными неймингами. И типичные проблемы с repo, с функционалом который не должен быть по определению в патерне Repository.


    1. sdramare
      04.11.2025 20:39

      Я поставил минус потому что статья не имеет никакой информационной цености, просто заметка "мой жизненный путь" в три абзаца. Хабр всетаки это не жж и не твиттер.


    1. comerc Автор
      04.11.2025 20:39

      Думаю, автору стоило бы рассказать о «300 секретах»: как он их создавал с помощью LLM. Мне и другим читателям было бы интересно об этом узнать.

      За других не уверен, судя по негативной реакции на мои откровения...

      В процессе загорается лампочка в голове, выписываешь вопрос. Правильно заданный вопрос - половина ответа. Клавдия всё знает. Потом интервальные повторения, что-то откладывается постепенно.

      Наверно началось всё с подготовки к алгоритмической сессии в Нёбиус. Получил список алгоритмов, составил конспект. Зубрил целый месяц - не помогло.

      Потом ещё была книжка "100 секретов Go", пока её штудировал, выписывал какие-то неочевидные для себя моменты. (Когда считаешь, что всё знаешь - а вот и нет).

      А ещё опросники к собесам конспектировал.


    1. comerc Автор
      04.11.2025 20:39

      на первый взгляд выглядит как беспорядочные папки и с проблемными неймингами. И типичные проблемы с repo, с функционалом который не должен быть по определению в патерне Repository.

      Просто не укладывается в привычные шаблоны. Почему нейминги проблемные? И какие вопросы к функционалу в repo? Было бы интересно послушать фидбэк.


  1. savostin
    04.11.2025 20:39

    Ну не знаю, делал несколько подходов уже. Прям заставляю себя перейти. Но это урезаное, вернее альтернативное, понимание ООП, классов и прочего стопорит на этапе проектирования кода. Понимаю, что проще начать с go, чем переходить, но автор же прям восхищается легкостью перехода от php/typescript…


    1. sdramare
      04.11.2025 20:39

      Для абсолютного большинства приложений ООП, особенно в том виде, в каком оно представленно в С++/Java просто не нужно.


      1. savostin
        04.11.2025 20:39

        А я чето привык все в классы заворачивать…


    1. comerc Автор
      04.11.2025 20:39

      Это откуда переход не даётся?


      1. savostin
        04.11.2025 20:39

        php, typescript, c++