- Home »

Создание Go приложений для разных ОС и архитектур
Сегодня разберёмся, как собирать Go-приложения под разные операционные системы и архитектуры. Почему это важно? Потому что мир серверов и хостинга — это не только x86_64 и Linux. Встречаются ARM, Windows, FreeBSD, иногда даже Solaris (да, кто-то ещё живёт на этом динозавре). А если вы хотите автоматизировать деплой, быстро тестировать или просто не зависеть от окружения — кросс-компиляция Go становится вашим лучшим другом. В этой статье — всё, что нужно знать, чтобы собрать Go-приложение под любую платформу, не сломать себе мозг и не потерять время на бессмысленные танцы с бубном.
Как это работает: магия кросс-компиляции в Go
Go изначально проектировался как язык для серверных приложений, и его создатели (привет, Google!) позаботились о том, чтобы сборка под разные платформы была максимально painless. В отличие от C/C++, где кросс-компиляция — это отдельный квест с настройкой toolchain, в Go всё встроено в сам компилятор. Достаточно выставить две переменные окружения: GOOS
(операционная система) и GOARCH
(архитектура процессора). Всё, можно собирать бинарники хоть под Raspberry Pi, хоть под Windows Server, хоть под экзотический MIPS.
- GOOS — целевая ОС (linux, windows, darwin, freebsd, openbsd, netbsd, solaris, aix, js, android и др.)
- GOARCH — архитектура (amd64, 386, arm, arm64, mips, mipsle, ppc64, ppc64le, riscv64, s390x, wasm и др.)
Go-компилятор сам подтянет нужные runtime и стандартные библиотеки, слинкует всё статически (ещё один плюс — не надо таскать за собой кучу .so/.dll), и на выходе получится готовый бинарник, который можно запускать на целевой платформе без дополнительных зависимостей.
Как быстро и просто всё настроить: пошаговый гайд
Всё, что вам нужно — установленный Go (желательно свежий, скачать тут). Дальше — дело техники.
- Проверьте версию Go:
go version
- Проверьте, какие платформы поддерживаются:
go tool dist list
Выдаст список всех поддерживаемых комбинацийGOOS/GOARCH
. - Соберите бинарник под нужную платформу:
Например, для Linux/amd64:
GOOS=linux GOARCH=amd64 go build -o myapp-linux-amd64 main.go
Для Windows/386:
GOOS=windows GOARCH=386 go build -o myapp-win32.exe main.go
Для ARM (например, Raspberry Pi):
GOOS=linux GOARCH=arm GOARM=7 go build -o myapp-arm main.go
- Проверьте размер и тип файла:
file myapp-linux-amd64
ls -lh myapp-*
Всё! Можно копировать бинарник на сервер, VPS или даже на роутер, если тот поддерживает Linux и нужную архитектуру.
Примеры, схемы, практические советы
Давайте разберём несколько кейсов из жизни, чтобы понять, где кросс-компиляция Go реально спасает.
Кейс | Проблема | Решение на Go | Рекомендация |
---|---|---|---|
Деплой на ARM-сервер (Raspberry Pi, AWS Graviton, Oracle ARM VPS) | Локально только x86_64, на сервере ARM64. Docker не всегда помогает (особенно если нужен чистый бинарник). | GOOS=linux GOARCH=arm64 go build | Собирайте на своей машине, копируйте бинарник — никаких зависимостей, всё работает из коробки. |
Автоматизация на Windows-серверах | Пишете скрипты на Linux, а запускать надо на Windows (например, для обслуживания VPS на Windows Server). | GOOS=windows GOARCH=amd64 go build | Go отлично компилируется под Windows, даже если вы работаете на Mac или Linux. |
Минималистичный мониторинг на роутере (OpenWRT, MIPS/ARM) | Роутер не поддерживает Python, Perl, bash-скрипты — только бинарники. | GOOS=linux GOARCH=mipsle go build | Go позволяет собрать tiny-бинарник, который работает даже на старых роутерах. |
CI/CD: тесты и сборка под все платформы | Нужно убедиться, что приложение работает на всех поддерживаемых ОС/архитектурах. | Мультибилд через matrix в GitHub Actions, GitLab CI и т.д. | Go идеально интегрируется с CI/CD, сборка под десятки платформ — вопрос одной yaml-конфигурации. |
Положительные и отрицательные кейсы
- Плюсы:
- Сборка под любую платформу без виртуалок и докеров.
- Статическая линковка — переносимость, минимальные зависимости.
- Простота автоматизации (скрипты, CI/CD, деплой).
- Маленький размер бинарников (особенно если использовать
go build -ldflags="-s -w"
и UPX для упаковки).
- Минусы:
- Не все C-библиотеки поддерживаются (если используете cgo, нужна целевая toolchain).
- Некоторые системные вызовы могут отличаться (например, работа с сетью или файловой системой на разных ОС).
- Редкие баги при кросс-компиляции под экзотические платформы (но это скорее исключение).
Команды для сборки под разные платформы
# Linux x86_64
GOOS=linux GOARCH=amd64 go build -o app-linux-amd64 main.go
# Linux ARMv7 (Raspberry Pi 3)
GOOS=linux GOARCH=arm GOARM=7 go build -o app-linux-armv7 main.go
# Linux ARM64 (Raspberry Pi 4, AWS Graviton)
GOOS=linux GOARCH=arm64 go build -o app-linux-arm64 main.go
# Windows 64-bit
GOOS=windows GOARCH=amd64 go build -o app-win64.exe main.go
# macOS (Intel)
GOOS=darwin GOARCH=amd64 go build -o app-macos-amd64 main.go
# macOS (Apple Silicon)
GOOS=darwin GOARCH=arm64 go build -o app-macos-arm64 main.go
# FreeBSD
GOOS=freebsd GOARCH=amd64 go build -o app-freebsd main.go
# OpenWRT (MIPS little-endian)
GOOS=linux GOARCH=mipsle go build -o app-mipsle main.go
# WebAssembly (для браузера)
GOOS=js GOARCH=wasm go build -o app.wasm main.go
Полный список поддерживаемых платформ — тут.
Похожие решения, программы и утилиты
- gox — утилита для мультиплатформенной сборки Go-приложений (одной командой собирает под все нужные платформы).
- xgo — кросс-компиляция Go с поддержкой cgo (через docker-образы с нужными toolchain).
- Taskfile — удобный таск-раннер для автоматизации сборки и деплоя.
- Docker multi-arch build — если нужен контейнер, а не голый бинарник.
Статистика и сравнение с другими языками
Язык | Кросс-компиляция | Статическая линковка | Размер бинарника | Сложность настройки |
---|---|---|---|---|
Go | Встроена, 2 переменные окружения | Да (по умолчанию) | ~2-10 МБ (можно уменьшить) | Минимальная |
Rust | Через --target , нужны toolchain |
Да (но иногда нужны дополнительные флаги) | ~1-5 МБ (strip, upx) | Средняя |
C/C++ | Требуется отдельный toolchain | Редко (обычно динамическая) | ~100 КБ – 1 МБ (но нужны .so/.dll) | Высокая |
Python | Нет (нужен интерпретатор) | Нет | ~10-50 МБ (pyinstaller) | Высокая |
Go — явный лидер по простоте и скорости кросс-компиляции. Rust тоже хорош, но требует больше ручной работы. C/C++ — боль и страдания, если не хотите собирать всё на целевой платформе.
Интересные факты и нестандартные способы использования
- Go позволяет собирать бинарники для WebAssembly (
GOOS=js GOARCH=wasm
), что открывает путь к запуску серверных утилит прямо в браузере (например, для тестирования или демо). - Можно собирать tiny-бинарники для IoT-устройств, роутеров, NAS — даже если там нет gcc, python или bash.
- Go отлично подходит для написания кроссплатформенных CLI-утилит: один исходник — десятки платформ.
- С помощью goreleaser можно автоматизировать релизы под все платформы, включая генерацию deb/rpm/pacman-пакетов и публикацию на GitHub Releases.
- Go можно использовать для написания скриптов-демонов, которые работают на любом сервере без установки дополнительных пакетов (идеально для VPS и выделенных серверов — VPS, dedicated).
Какие новые возможности открываются и чем это поможет в автоматизации и скриптах?
- Можно писать свои агенты мониторинга, резервного копирования, деплоя — и запускать их на любом сервере, не думая о зависимостях.
- Автоматизация CI/CD: собирайте и тестируйте под все платформы, не держите отдельные build-сервера для каждой архитектуры.
- Миграция между хостингами и ОС: неважно, где окажется ваш сервер — Go-бинарник запустится везде.
- Минимизация attack surface: не надо ставить интерпретаторы, компиляторы, лишние пакеты — только ваш бинарник.
- Быстрый деплой: копируйте бинарник — и всё работает. Даже если сервер только что из коробки.
Вывод — заключение и рекомендации
Кросс-компиляция в Go — это не просто удобная фича, а реальный инструмент для ускорения работы с серверами, автоматизации и деплоя. Если вы обслуживаете разные VPS, выделенные серверы, роутеры, NAS — Go позволяет писать и собирать приложения под любую платформу за минуты, а не часы. Это экономит время, нервы и ресурсы. Не бойтесь экспериментировать: пробуйте собирать под ARM, MIPS, Windows, FreeBSD — и вы удивитесь, насколько это просто.
Рекомендую использовать Go для написания любых серверных утилит, автоматизации, мониторинга, резервного копирования и даже для небольших web-сервисов, если важна скорость деплоя и переносимость. Для автоматизации сборки — смотрите в сторону goreleaser и gox. Если нужен VPS или выделенный сервер для экспериментов — VPS, dedicated — отличное место для старта.
Go — это про скорость, простоту и надёжность. Используйте его возможности на полную, и ваши серверы скажут вам спасибо.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.