Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → Go на ноутбуке: скорость сборки, кэш и кросс-компиляция

Go-тулчейн на ноутбуке: почему сборки быстрые, куда уходит место и как собирать под другие ОС

Особенности разработки на Go на ноутбуке: GOPATH/GOMODCACHE и место на диске, GOCACHE, скорость инкрементальных сборок, кросс-компиляция одним флагом, ресурсы и IDE.

Прямой ответ

Go — самый «ноутбучно-дружелюбный» компилируемый тулчейн: один бинарник установки без зависимостей, инкрементальная сборка среднего сервиса за секунды, компиляция статического бинарника без внешних рантаймов, а кросс-компиляция под Linux/Windows/macOS — двумя переменными окружения без всяких toolchain-надстроек. Цена — дисковые кэши: GOMODCACHE (скачанные модули) и GOCACHE (результаты сборки) за месяцы работы разрастаются до 5–15 ГБ. По ресурсам разработка на Go скромна: 16 ГБ ОЗУ хватает с большим запасом, тяжёлые сборки упираются в CPU и SSD, а не в память.

Установка и структура каталогов

Установка — архив/пакет с go.dev или пакетный менеджер (apt install golang-go даёт более старую ветку; для актуальной — официальный tarball или go install golang.org/dl/go1.2x@latest). Проверка: go version, go env GOMODCACHE GOCACHE.

Что где живёт:

  • GOMODCACHE (по умолчанию ~/go/pkg/mod) — глобальный кэш всех скачанных модулей всех проектов, только для чтения;
  • GOCACHE (~/.cache/go-build) — кэш результатов компиляции пакетов; именно он делает повторные сборки мгновенными;
  • ~/go/bin — установленные через go install утилиты (добавьте в PATH).

Аналогия для понимания: GOMODCACHE — как глобальный store pnpm, GOCACHE — как filesystem-кэш webpack; и те и другие безопасно удалять, цена — повторное скачивание/компиляция.

Скорость сборки: что на неё влияет

Инкрементальная сборка перекомпилирует только изменённые пакеты — отсюда секунды на типичном проекте. Факторы, которые её портят:

  1. Холодный кэш после go clean -cache — первая сборка проекта заново компилирует всё дерево зависимостей (минуты на крупном проекте). Не чистите кэш «профилактически».
  2. Медленный диск/антивирус: сборка Go — тысячи операций с файлами; на Windows Defender без исключений для ~/go и каталога проекта замедляет всё заметно.
  3. cgo-зависимости (пакеты с C-кодом) требуют C-компилятор и ломают чистоту кросс-компиляции; где возможно — выбирайте pure-Go альтернативы (например, чистые драйверы СУБД).
  4. Параллелизм: go build использует все ядра (-p N); на 4-ядёрном ноутбуке сборки длиннее — это объективное ограничение железа.

Диагностика долгих сборок: go build -x покажет фактические шаги, time go build ./... — где именно время (компиляция против линковки).

Кросс-компиляция: главное преимущество Go

Сборка linux-бинарника с ноутбука на Windows/macOS:

GOOS=linux GOARCH=amd64 go build -o app-linux .
GOOS=windows GOARCH=arm64 go build -o app-win.exe .

Никаких контейнеров и cross-toolchain — компилятор встроен. Это меняет workflow: собрать и проверить артефакт для сервера можно локально за секунды, а финализировать — в минимальном Docker-образе (схемы multi-stage — в статье про оптимизацию образов). Ограничение одно — cgo (см. выше) и CGO-зависимые тесты.

Ресурсы: сколько нужно ноутбуку

  • RAM: сам компилятор экономичен; 8 ГБ хватает для среднего проекта, 16 ГБ — комфорт с IDE и контейнерами. Пик памяти дают линковка крупных бинарников и параллельные тесты (go test ./... на монорепо).
  • Диск: закладывайте 10–20 ГБ под кэши при активной работе; чистка — go clean -modcache (модули) и go clean -cache (сборка) — безопасна, но следующая сборка будет холодной. Порядок аудита диска — вместе с node_modules и Python-окружениями в статье про место на диске.
  • CPU: сборки параллельны, 6–8 ядер дают почти линейное ускорение против 4.

IDE и рабочая среда

Штатная связка — VS Code + официальное расширение Go (gopls как языковой сервер): лёгкая, быстрая; потребление gopls на крупных проектах — 0,5–1,5 ГБ, лимиты и диагностика — в статье про IDE и ОЗУ. GoLand — полноценная JetBrains-IDE с более глубоким анализом ценой 2–3 ГБ памяти. Обязательные утилиты тулчейна: gofmt/goimports (форматирование при сохранении), golangci-lint (агрегатор линтеров — ставьте бинарником, не go get), delve (отладчик).

FAQ

Почему go build первый раз медленный, а потом мгновенный? Работает GOCACHE: первая сборка компилирует все пакеты зависимостей, повторные переиспользуют результаты. Кэш общий для всех проектов — второй проект с теми же зависимостями соберётся сразу быстрее.

Можно ли удалить папку ~/go целиком? Да, это кэши и установленные утилиты: всё восстановится (go mod download, go install). Проекты при этом не храните внутри ~/go — с Go-модулями это не требуется.

Go против Rust для старта на слабом ноутбуке? Go легче по ресурсам и времени сборки, Rust даёт больше контроля ценой более долгих компиляций — сравнение в статье про Rust/Cargo на ноутбуке.

Нужен ли Docker для разработки на Go? Для кодинга — нет, тулчейн самодостаточен. Docker полезен для финальной упаковки (multi-stage, scratch-образы) и интеграционных тестов с реальными сервисами.

Мини-сценарий: от кода до артефакта за минуты

Показательный цикл, ради которого Go выбирают для утилит. Новый CLI-инструмент: go mod init mytool, пара файлов, go run . — первая итерация через секунды после установки тулчейна. Отладка — dlv debug или просто логи. Сборка релиза под три платформы — три команды с GOOS/GOARCH, артефакты появляются в папке проекта без единого контейнера. Упаковка — COPY бинарника в scratch-образ (схема из статьи про multi-stage). Весь путь — минуты, и ни один шаг не требует ни сервера, ни облака, ни специальных знаний.

Сравните с ресурсной ценой: пик памяти при сборке небольшой утилиты — сотни мегабайт, место на диске — тулчейн ~300 МБ плюс кэши. Именно поэтому Go комфортен на старых и слабых ноутбуках, где JVM- и Rust-проекты уже заставляют считать гигабайты. Если же задача — системное программирование с контролем памяти, смотрите сравнение с Rust в соседней статье блока; для большинства прикладных бэкенд-утилит баланс скорости разработки и потребления ресурсов у Go трудно побить.

Почему go test ./... медленный на монорепо? Он собирает и гоняет тесты всех пакетов; используйте фильтрацию (go test ./services/api/...) и кэш тестов (он включён: повторный прогон без изменений отдаёт закэшированный результат за миллисекунды — пометка (cached)). Принудительный перезапуск — -count=1.

Источники: документация Go (установка, модули, переменные окружения cmd/go) — ссылки в шапке.