логотип PurpleSchool
логотип PurpleSchool

Команда go build в Golang

Автор

Александр Гольцман

go build — одна из ключевых команд в экосистеме Go. Она отвечает за компиляцию исходного кода в исполняемый файл, управляет зависимостями и позволяет подготовить проект к запуску. В этой статье я разберу, как работает go build, какие флаги могут быть полезны, как настроить кросс-компиляцию и что делать, если сборка завершается с ошибкой.

Как работает go build

Смотрите, go build компилирует Go-код и создаёт исполняемый файл. Например, если в текущей директории есть main.go, можно запустить:

go build

После этого появится исполняемый файл с тем же именем (main на Linux/macOS или main.exe на Windows).

Если проект состоит из нескольких пакетов, go build можно запустить для конкретного пути:

go build ./cmd/app

Здесь ./cmd/app — это путь к пакету с main.go. Если собрать библиотечный пакет, go build просто проверит код на ошибки, но бинарник не создаст.

Полезные флаги

Команда go build поддерживает множество параметров, но я выделю те, которые пригодятся в работе:

  • o <файл> — задаёт имя выходного бинарника. Например:
    go build -o myapp
    создаст исполняемый файл myapp.
  • v — выводит информацию о процессе сборки. Полезно, если хотите видеть, какие пакеты компилируются:
    go build -v
  • x — показывает внутренние команды, выполняемые при сборке. Помогает разбираться с ошибками.
  • race — включает детектор гонок данных. Особенно важно при работе с горутинами:
    go build -race
  • trimpath — удаляет пути к исходным файлам из бинарника, уменьшая его размер и скрывая детали системы:
    go build -trimpath

Кросс-компиляция с go build

Go позволяет собирать приложения для разных операционных систем и архитектур. Для этого перед go build можно указать переменные окружения GOOS и GOARCH. Например, сборка под Windows с Linux/macOS:

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

Для сборки под Linux с Windows можно использовать:

SET GOOS=linux
SET GOARCH=amd64
go build -o app

Полный список поддерживаемых платформ можно получить командой:

go tool dist list

Ошибки при сборке и их решение

Смотрите, go build может завершаться с ошибками, если:

  1. Не хватает зависимостей. Проверьте их с помощью go mod tidy и go mod vendor.
  2. Несовместимые версии пакетов. Попробуйте go list -m all и обновите зависимости с go get -u.
  3. Конфликты в коде. Иногда помогает go clean -cache для очистки кеша сборки.

Заключение

go build — это основной инструмент сборки проектов в Go. Он компилирует код, проверяет зависимости, позволяет выполнять кросс-компиляцию и оптимизировать бинарники. Я показал основные флаги и примеры использования, но если ваш проект становится сложнее, имеет смысл изучить также go install и go run, которые дополняют возможности go build.

Попробуйте применить эти команды в своих проектах — так вы лучше поймёте, как управлять процессом сборки в Go.

Стрелочка влевоРабота с переменными окружения (env) в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsСтрелочка вправо

Все гайды по Golang

Работа с YAML в GolangПреобразование типов в GolangКонвертация структур в JSON в GolangStrconv в GolangИспользование пакета SQLx для работы с базами данных в GolangРазбираемся с SQL в GolangРазделение строк с помощью функции split в GolangSort в GoПоиск и замена строк в Go - GolangИспользование пакета reflect в GolangРабота с PostgreSQL в GoPointers в GolangПарсинг в GoРабота со списками (list) в GolangПреобразование int в string в GolangРабота с числами с плавающей точкой в GolangРабота с полями в GolangИспользование enum в GolangОбработка JSON в GoЧтение и запись CSV-файлов в GolangРабота с cookie в GolangРегистры в GoКэширование данных в GolangПреобразование byte в string в GolangByte в GoИспользование bufio для работы с потоками данных в GolangДобавление данных и элементов (add) в Go
Логирование в Golang. Zap, Logrus, Loki, GrafanaРабота с Docker-контейнерами в GoИспользование pprof в GolangМеханизмы синхронизации в GolangРабота с пакетом S3 в GolangМониторинг Golang приложений с помощью PrometheusОптимизация проектов на GoПаттерны проектирования в GolangМиграции базы данных в GolangОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangКак развернуть Go-приложение на облаке AWSАутентификация в Golang
Сетевые протоколы в GoПеременные в GolangЗначения в GolangДженерик %T и его применение в GolangТипы данных в GolangИспользование tls в GolangИспользование tag в структурах GolangSwitch в GoСтроки в GolangРабота с потоками (stream) в GolangSelect в GoРуны в GoРабота с пакетом params в GolangКонвертация строк в числа в GolangNull, Nil, None, 0 в GoНаименования переменных, функций и структур в GoInt в GolangУстановка GolangЧтение и установка HTTP заголовков в GolangMethods в GolangGoLand — IDE для разработки на Golang от JetBrainsОбработка «not found» в GolangFloat в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний