Вы пишете на PHP уже несколько лет, делаете API, знаете Laravel или Symfony. И всё чаще слышите: "Вот бы на Go переписать". Разберёмся, что за этим стоит, чего ожидать от перехода и как не потерять полгода на хаотичное самообучение.
Почему PHP-разработчику стоит посмотреть на Go
Go создан в Google в 2009 году как ответ на конкретную проблему: писать системный и сетевой код быстрее C++, но без его сложности. Сегодня на нём работают Docker, Kubernetes, Cloudflare, Uber, Netflix, Binance - компании, где счёт запросов идёт на миллионы в секунду.
Модель исполнения: share-nothing PHP vs long-running Go
PHP работает по принципу share-nothing: каждый HTTP-запрос поднимает новый процесс (или FPM-воркер), выполняет код и умирает. Это предсказуемо и безопасно, но дорого при высокой нагрузке - сотни воркеров едят память.
Go-сервер - долгоживущий процесс. Он запускается один раз и принимает все запросы через net/http (или Gin/Fiber). Это означает, что глобальные переменные живут между запросами - привычка из PHP здесь может привести к утечкам данных.
Горутины: как Go делает параллелизм дешёвым
Горутина (goroutine) - легковесная единица конкурентности в Go. Начальный стек горутины занимает 2–8 КБ, а планировщик Go сам распределяет их по ядрам CPU (M:N модель). В PHP нет многопоточности совсем - ни горутин, ни тредов внутри одного запроса.
Запустить тысячу горутин параллельно - норма для Go. Сделать то же на PHP потребует очереди задач (RabbitMQ/Kafka) и отдельного воркер-пула.
Почему Go выбирают для highload и микросервисов
Go компилируется в единый статически слинкованный бинарник. Никаких зависимостей на сервере - только файл. Это упрощает деплой в Docker до COPY app /app и делает
образ минимальным.
Рассмотрим . Когда компания решила переписать свою NoSQL-базу, пилотная команда освоила Go и создала новую версию с нуля всего за шесть месяцев. Результат говорит сам за себя: нагрузка на CPU снизилась на 10%, а сегодня 30% всех кластеров PayPal уже работают на Go. Более сотни разработчиков используют язык в production — не только для базы, но и для роутеров, балансировщиков нагрузки и SDN-инфраструктуры. Секрет в самом языке: горутины делают конкурентный код простым и безопасным, а статическая компиляция даёт быструю сборку и избавляет от возни с зависимостями.
Что придётся забыть из PHP - и что получить взамен
PHP и Go решают одни задачи разными способами. Ни один не "лучше" - они просто исходят из разных философий. Вот главные точки расхождения.
ООП в PHP vs структуры и интерфейсы Go
В PHP есть классы, наследование, трейты, абстрактные классы. В Go этого нет. Вместо классов - структуры (struct), вместо наследования - композиция.
// PHP: класс с наследованием
class User extends BaseModel
{
public function greet(): string
{
return "Привет, " . $this->email;
}
}
// Go: никакого наследования, только вложение структур
type User struct {
ID int
Email string
}
func (u User) Greet() string {
return "Привет, " + u.Email
}
Интерфейсы Go реализуются неявно: если структура имеет нужные методы, она уже реализует интерфейс. Не нужно писать implements. Это похоже на duck typing в Python, но со статической проверкой на этапе компиляции.
Исключения PHP vs error-значения Go
PHP использует try/catch/Exception. Go - нет. Функции возвращают два значения: результат и ошибку.
result, err := doSomething()
if err != nil {
return fmt.Errorf("doSomething failed: %w", err)
}
Это многословно и поначалу раздражает. Зато каждая ошибка явна - нет скрытых исключений, которые "всплывут" в неожиданном месте.
Composer vs go.mod: управление зависимостями
composer.json → go.mod. Логика та же: фиксируешь зависимости, запускаешь go mod tidy. Разница в том, что Go-модули версионируются через Git-теги, а сами пакеты скачиваются напрямую с GitHub/GitLab без центрального реестра (хотя служит каталогом).
5 подводных камней при переходе: опыт Lamoda Tech
Костя Козин, старший PHP-разработчик Lamoda Tech с 17-летним опытом, описал пять ловушек, которые ждут при переходе с PHP на Go. Его команда создала целый онбординг-курс для PHP-разработчиков именно потому, что у многих первые месяцы отбивали желание работать с языком.
"Так принято" - не аргумент: идиоматика vs здравый смысл
В Go много идиоматических решений. Вы будете слышать "это принято" про короткие имена переменных, про обработку ошибок, про структуру пакетов. Верить на слово не нужно - у большинства "правил" есть контекст и исключения. Читайте напрямую.
Простой синтаксис ≠ простой язык
Маркетинг Go говорит: "язык очень простой". Это правда про синтаксис - 25 ключевых слов против ~70 у PHP. Но это не значит, что язык прост в использовании.
Один цикл for вместо четырёх (for, foreach, while, do-while) - это меньше синтаксиса, но больше думать о логике. Отсутствие DI-контейнеров с autowiring означает: всё делаешь руками.
Горутины и утечки: race condition и goroutine leak
PHP-разработчик не привык думать о конкурентности - в PHP её нет внутри запроса. В Go горутины легко запустить, но легко и забыть остановить. Горутина без механизма завершения "висит" и съедает память. Детектор race condition (go test -race) ловит не всё.
Правило: каждой горутине нужен context.Context с таймаутом или отменой.
Роадмэп Go для PHP-разработчика: план на 6 месяцев
Шесть месяцев - минимальный срок до уровня "пишу рабочий production-сервис". Реалистичный план по двухмесячным блокам:
Месяц 1–2: ядро языка
Пройдите - интерактивно, бесплатно, 2–3 дня.
Освойте типы:
int,string,bool,slice,map,struct,pointer.Поймите горутины и каналы на базовом уровне.
Напишите CLI-утилиту: парсер CSV или HTTP-клиент.
Читайте параллельно.
Месяц 3–4: REST-сервис и работа с базой данных
Поднимите REST API на Gin или Fiber.
Подключите PostgreSQL через
sqlxилиGORM.Напишите первые тесты через
go test.Разберитесь с
context.Context- он в каждой production-функции.Попробуйте gRPC: сгенерируйте стаб из
.proto-файла.
Месяц 5–6: Docker, Kubernetes, профилировка
Упакуйте сервис в Docker - multi-stage build даст образ меньше 20 МБ.
Разверните в Kubernetes через Helm-чарт (базовый уровень).
Профилируйте с pprof: найдите горячую точку в коде.
Настройте CI с
golangci-lint- он заменит PHP_CodeSniffer и PHPStan.Прочитайте книгу "100 ошибок Go и как их избежать" Тейвы Харшани - после базового освоения она даст +1 уровень к качеству кода.
Инструменты Go, которые заменят привычный PHP-стек
Одно из неочевидных преимуществ Go - богатый toolchain из коробки. Не нужно искать и настраивать десятки инструментов, как в PHP-экосистеме.
gofmt, golangci-lint: единый стиль без споров
gofmtформатирует код автоматически - стиль не обсуждается в команде.golangci-lintобъединяет десятки линтеров в один запуск. Настраивается через.golangci.ymlи легко встраивается в GitHub Actions или GitLab CI.
go test и моки: тестирование без PHPUnit
go test ./... - тесты запускаются из коробки, без установки фреймворка. Мокировать в Go сложнее, чем в PHPUnit, - нет магических моков. Используют либо ручные реализации интерфейсов, либо кодогенератор mockery.
Авторская ремарка. Косвенная польза от "ручных моков": Go заставляет думать об интерфейсах заранее. Это улучшает архитектуру - меньше "божественных классов" и скрытых зависимостей.
pprof + benchmarks: ищем узкие места под нагрузкой
go test -bench=. запускает бенчмарки прямо в тестовых файлах. pprof строит флейм-граф CPU и памяти - наглядно видно, где тормозит. PHP-разработчик, привыкший к Blackfire или Xdebug, оценит простоту подключения: добавляешь import _ "net/http/pprof" и получаешь эндпоинт /debug/pprof/.
Фреймворки Go: Gin, Fiber и когда обходиться без них
PHP без Laravel - редкость. Go без фреймворка - норма. Стандартная библиотека net/http покрывает базовые потребности REST API.
| net/http | Gin | Fiber | |
|---|---|---|---|
| Роутинг с параметрами | Базовый | ✅ httprouter | ✅ fasthttp |
| Middleware цепочки | Вручную | ✅ | ✅ |
| Документация | Официальная | Большое сообщество | Хорошая |
| Схожесть с PHP-фреймворком | - | - | Express.js (Node) |
| Когда выбирать | Простые API, обучение | Production REST, знакомый стиль | Максимальная скорость, Express-бэкграунд |
Gin имеет более 88.6k звёзд на GitHub (данные 2026 года) и широко используется в production в России. Fiber быстрее по сырым бенчмаркам благодаря fasthttp, но несовместим с частью стандартных net/http middleware.
Альтернативная точка зрения
Переходить на Go необязательно. Андрей Литвиненко, PHP-разработчик с 15-летним опытом, перешедший в NUT.Tech, честно описал: Go - другой язык с другой философией, и подгонять его под PHP - ошибка. Если ваши проекты - CMS, интернет-магазины, средненагруженные API, PHP 8.4 закрывает потребности полностью. Go имеет смысл, когда нагрузка действительно высокая, нужны микросервисы или вы целенаправленно меняете специализацию.
Нетривиальный факт
Docker и Kubernetes - два главных инструмента современного DevOps - написаны на Go. Это не случайность: Go изначально проектировался для системных задач с высокой нагрузкой. Когда вы деплоите Go-сервис в Kubernetes, весь стек от оркестратора до приложения написан на одном языке.
FAQ
Сколько времени нужно PHP-разработчику, чтобы освоить Go?
По опыту команды Lamoda Tech - минимум 6 месяцев до рабочего production-кода . Ещё столько же уходит на восстановление качества до привычного уровня.
Чем горутины отличаются от PHP-процессов?
Горутина - лёгковесная единица конкурентности (начальный стек ~2–8 КБ). PHP-разработчику многопоточность внутри запроса недоступна. Go-планировщик распределяет горутины по ядрам CPU автоматически (M:N модель).
Есть ли в Go аналог Laravel?
Полного аналога нет. Культура Go предпочитает минимализм: Gin и Fiber - для роутинга, sqlx/GORM - для БД, всё собирается вручную. Это сознательная философия - меньше магии, больше контроля .
Как в Go заменить try/catch из PHP?
Функции возвращают пару (result, error). Проверяете if err != nil и передаёте ошибку вверх с контекстом через fmt.Errorf("...: %w", err). panic/recover - только для критических сбоев.
Какой фреймворк выбрать: Gin или Fiber?
Gin - зрелый выбор с большим сообществом. Fiber быстрее в бенчмарках (fasthttp), но несовместим с частью net/http middleware. Для старта - Gin.
Стоит ли переходить с PHP на Go без highload?
Не обязательно. PHP 8.4 закрывает потребности CMS и средненагруженных API. Go имеет смысл при реальных задачах highload, микросервисах или смене специализации.
Что такое context.Context и зачем он нужен?
Механизм передачи таймаутов и сигнала отмены через цепочку вызовов. Каждая горутина должна получать контекст и реагировать на его отмену - иначе горутины "зависают" в памяти (goroutine leak) .
Источники
Козин К. "Переход на Go глазами PHP-разработчика: 5 подводных камней" -
Литвиненко А. "Впечатления о Golang от разработчика на PHP" -
"Почему Go выбирают компании для микросервисов и highload-проектов" -
"PHP или Go: что выбрать новичку в 2025–2026 году" -
"PHP или Go - какой язык выбрать в 2025 году?" -
Effective Go - официальная документация Go -
Go Tour - интерактивное обучение -
pkg.go.dev - каталог Go-пакетов -




.svg.webp)




