Go (Golang) — компилируемый язык программирования, разработанный Google в 2007–2009 годах. Цель: заменить C++ и Java в серверной разработке при сохранении простоты синтаксиса. Компилируется в один статический бинарный файл без зависимостей от рантайма — деплой сводится к копированию одного файла. Стандартная библиотека включает HTTP-сервер, криптографию, парсинг JSON, тестирование.
Ключевые особенности
- Goroutines: легковесные потоки (от 2 КБ стека vs 1–2 МБ для OS-потока). Планировщик Go мультиплексирует goroutines на OS-потоки. Миллион одновременных goroutines — рабочий сценарий.
- Channels: CSP-примитив (Communicating Sequential Processes) для безопасного обмена данными между goroutines.
ch := make(chan int, 100) - Статическая линковка:
CGO_ENABLED=0 go buildсоздаёт бинарник без системных библиотек. Работает в scratch Docker-образе (< 20 МБ). - Быстрая компиляция: миллион строк Go компилируется быстрее, чем 100 000 строк C++.
- GC с малыми паузами: в Go 1.14+ паузы GC < 1 мс при типичной нагрузке.
История
Go начал разрабатывать Роберт Грисемер (Robert Griesemer), Роб Пайк (Rob Pike) и Кен Томпсон (Ken Thompson) в Google в 2007 году. Первый публичный релиз — ноябрь 2009 года. Go 1.0 (март 2012) установил обратную совместимость API. Go 1.5 (2015) — самохостящийся компилятор (написан на Go, не на C). Go 1.18 (2022) — дженерики (Generics), долгожданная функциональность. Go 1.21 (2023) — стандартная библиотека для структурированного логирования (slog), slices/maps/cmp пакеты. Написаны на Go: Docker, Kubernetes, Terraform, Prometheus, CockroachDB, InfluxDB.
Применение в хостинге
Go-сервисы запускаются напрямую как бинарный файл: ./myapp -port 8080. Через systemd-юнит или в Docker. Reverse proxy (Nginx или Traefik) стоит перед Go-сервисом и обрабатывает SSL, сжатие, статику. Типичные фреймворки: Gin (высокопроизводительный HTTP), Echo, Fiber (совместим с Express API), Chi. Минимальное потребление RAM: Go-сервер начинает работу с 10–30 МБ RAM против 100–500 МБ для JVM-приложений.
Go vs Java vs Node.js
| Параметр | Go 1.22 | Java (JVM) 21 | Node.js 22 |
|---|---|---|---|
| Холодный старт | ~50 мс | 500–2000 мс (JVM warmup) | ~100 мс |
| RAM (idle) | 10–30 МБ | 100–500 МБ | 30–80 МБ |
| Конкурентность | Goroutines + channels | Virtual Threads (Java 21) | Event loop (single-thread) |
| Деплой | Один бинарник | JAR + JVM | node_modules + runtime |
На что обращать внимание
На VPS для Go-сервиса достаточно 1 ГБ RAM для большинства приложений. Кросс-компиляция: GOOS=linux GOARCH=amd64 go build собирает Linux-бинарник с macOS или Windows. В Docker — используй многоступенчатую сборку: builder-образ с Go toolchain + scratch или distroless итоговый образ. Убедитесь, что приложение корректно обрабатывает SIGTERM для graceful shutdown — иначе при перезапуске контейнера активные запросы обрываются.