логотип 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

Рассмотренные в статье флаги и опции команды go build позволяют тонко настроить процесс сборки. Однако, для понимания, как именно эти флаги влияют на конечный бинарный файл, необходимо хорошо понимать, как Golang работает под капотом, как устроена память и как происходит компиляция. Если вы хотите детальнее погрузиться в эти вопросы, а также узнать больше о возможностях языка — приходите на наш большой курс Основы Golang. На курсе 193 уроков и 16 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.

Здесь ./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.

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

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

Постройте личный план изучения Golang до уровня Middle — бесплатно!

Golang — часть карты развития Backend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по 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Трейсинг запросов с OpenTelemetry в GoНастройка шины событий NATS NSQ в GoМиграции базы данных в GolangНастройка уровней логирования log levels в GoОркестрация контейнеров Go с Kubernetes + DockerGjGo Playground и компилятор GolangИспользование go mod init для создания модулей GolangРабота с переменными окружения (env) в GolangКоманда go build в GolangАвтоматизация Golang проектов — CI/CD с GitLab CI и JenkinsРуководство по embed в GoОтладка кода в GolangЧтение и использование конфигурации в приложениях на GolangКомпиляция в GolangРабота с пакетом Amazon S3 в 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 от JetBrainsFloat в GolangОбработка «not found» в GolangФлаги командной строки в Go (Golang)Запуск внешних команд в GolangОбработка ошибок в GoИспользование defer в GolangЗначения default в GolangГенерация кода в GoФорматирование кода в GolangЧистая архитектура в GolangКаналы (channels) в GolangПолучение body из HTTP запроса в Golang
Открыть базу знаний

Лучшие курсы по теме

изображение курса

Основы Golang

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Nest.js с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.6
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий