Встроенные инструменты Golang

Благодаря фантастическому набору встроенных инструментов, Go позволяет разработчикам с легкостью писать, создавать и тестировать проекты, а также управлять ими. Усовершенствуем работу с кодом, изучив этот инструментарий.

Вот краткая характеристика всех инструментов:

Познакомимся с ними подробнее.

Встроенный инструмент go build

go build

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

Основные идеи

Компиляция без усилий. С go build не нужно ломать голову над сложными конфигурациями проекта или внешними системами сборки, код и зависимости Go интеллектуально анализируются.

Платформонезависимость. Легко генерируются исполняемые файлы для различных операционных систем и архитектур, задаваемых в переменных среды́ GOOS и GOARCH: Linux, Windows, macOS, ARM.

Настройка. С помощью дополнительных параметров go build контролируются название выходного файла и флаги сборки для оптимизации, в двоичный файл напрямую вставляется статическое содержимое.

Пример

# Из текущего пакета собирается исполняемый файл
go build

# Сборка для архитектуры Linux AMD64
GOOS=linux GOARCH=amd64 go build

Когда использовать

  • При развертывании. Это основной вариант применения для подготовки приложений Go к независимому запуску в целевых системах.
  • При распространении. Упрощается применение другими программного обеспечения, сделанного на Go, среда разработки Go им при этом не требуется.
Встроенный инструмент go install

go install

Это такой же мощный инструмент, как go build. Пакеты или команды им легко компилируются и устанавливаются прямо в рабочую область Go. Поэтому go install  —  ценный компонент рабочего процесса разработки. Чтобы контролировать совместимость с проектами, при установке указываются версии пакетов.

  • Скомпилированные пакеты помещаются go install в основном в каталог pkg в $GOPATH, а исполняемые файлы  —  в $GOPATH/bin.
  • Для управления зависимостями большинства проектов рекомендуются модули Go.

Основные идеи

Установка пакетов. Загружаются и устанавливаются сторонние пакеты Go, их код становится доступным в проектах.

Создание команд. Написанные на Go инструменты командной строки компилируются, а полученные исполняемые файлы наглядно располагаются в каталоге $GOPATH/bin.

Управление зависимостями. Зависимости для устанавливаемого пакета или команды обрабатываются go install автоматически.

Эффективность разработки. Устанавливаются часто используемые команды или локальные пакеты Go, поэтому доступ к ним упрощается, процесс разработки ускоряется.

Пример

# Устанавливается пакет «goreleaser», это средство автоматизации выпусков
go install github.com/goreleaser/goreleaser@latest

# Проверяется корректность установки
goreleaser --help

Когда использовать

  • С go install загружаются и устанавливаются внешние пакеты Go, в проектах упрощается доступ к их коду.
  • С go install компилируются написанные на Go инструменты командной строки, для упрощения выполнения они добавляются в каталог $GOPATH/bin.
Встроенный инструмент go clean

go clean

go clean  —  незаменимый инструмент упорядочения проектных каталогов на Go. Им интеллектуально выявляются, удаляются объектные и временные файлы, другие артефакты, сгенерированные в процессе сборки.

Основные идеи

Гигиена рабочей области. Упрощаются проектные каталоги, облегчаются навигация и управление кодом.

Оптимизация сборки. За счет уменьшения объема работы компилятора время сборки в больших проектах потенциально сокращается.

Новый старт. Перед большими сборками или при устранении проблем компиляции все начинается с чистого листа.

Пример

# Очищается текущий каталог проекта
go clean

# Очищается и удаляется весь кэш сборки Go
go clean -cache

# Показывается, что́ очистится, без фактического удаления чего-либо.
go clean -n

Когда использовать

  • Периодически. go clean включается в рабочий процесс разработки для поддержания порядка в структуре проекта.
  • Перед распространением. С go clean подготавливаются упрощенные файлы проекта для совместного использования или развертывания.
  • Для устранения неполадок. go clean выполняют при возникновении неожиданных ошибок сборки, так иногда устраняются проблемы, вызванные устаревшими артефактами сборки.
Встроенный инструмент go fmt

go fmt

С go fmt исходный код автоматически переформатируется согласно каноническим стилевым рекомендациям Go. Этим инструментом совместно с gofmt закладывается основа общечитаемой, сопровождаемой кодовой базы Go.

Хотя в go fmt обеспечивается соблюдение официального стиля, во многих коллективах разработчиков согласованность форматирования совершенствуется средствами контроля качества кода и руководствами по стилю.

Основные идеи

Единообразие. Во всем коде Go, независимо от его авторства, соблюдаются согласованные интервалы, отступы, форматирование.

Удобство восприятия. Код Go становится удобнее и понятнее, совершенствуется совместная работа в коллективе.

Акцент на логике. Оставив споры о стиле кода, разработчики концентрируются на основной функциональности программ.

Пример

# Форматируются файлы в текущем каталоге 
go fmt

# Форматируются все файлы Go в текущем каталоге и подкаталогах
go fmt ./...

# Проверяется, отформатированы ли файлы, без их изменения
gofmt -l ./...

Когда использовать

  • Всегда. go fmt интегрируется в процесс разработки, во многих редакторах кода и интегрированных средах разработки при сохранении запускается автоматически.
  • Перед коммитами. go fmt запускается как хук перед фиксацией изменений, этим обеспечивается согласованность кода в коллективе разработчиков.
  • В устаревших проектах. Применением go fmt старый код Go оживляется, мгновенного становится удобнее для восприятия.
Встроенный инструмент go get

go get

Раньше с помощью go get загружались и устанавливались пакеты, но:

  • Начиная с версии Go 1.17, установка исполняемых файлов через go get прекращена. Теперь для этого используется go install.
  • С версии Go 1.18 роль go get  —  управление зависимостями в файле go.mod.
  • А с версии Go 1.22  —  управление зависимостями уже внутри модулей, за их пределами go get не применяется, в случае подхода GOPATH.

Пример

# Загружаются и обновляются все соответствующие пакеты
go get

# Загружается пакет логирования «github.com/sirupsen/logrus»
go get github.com/sirupsen/logrus

Когда использовать

  • В старых кодовых базах. go get встречается в устаревших проектах, еще не переведенных на новый инструмент загрузки и установки пакетов  —  модули Go.
  • В переходный период. Начиная с Go 1.17, go get используется для управления зависимостями в файле go.mod.
  • В настоящее время. Начиная с Go 1.22, зависимости управляются go get только внутри модулей.
Встроенный инструмент go mod download

go mod download

go mod download  —  важный компонент модульной системы управления зависимостями Go. Им загружаются конкретные версии зависимостей проекта, как определено в файлах go.mod и go.sum.

Основные идеи

Разрешение модулей. Необходимые модули и их зависимости извлекаются и сохраняются в кэше модулей, обычно это $GOPATH/pkg/mod.

Оффлайн-сборки. Загруженные зависимости доступны локально, поэтому над проектом Go можно работать без постоянного интернет-подключения.

Согласованность версий. Предсказуемость сборок обеспечивается точным соответствием указанным в go.mod и go.sum версиям зависимостей.

Пример

# Загружаются зависимости для текущего модуля
go mod download

# Загружаются зависимости для конкретного модуля, особенно во многомодульных конфигурациях
go mod download github.com/some/module

Когда использовать

  • При инициализации. go mod download применяется после инициализации нового модуля Go или при внесении изменений в файл go.mod.
  • Перед сборкой. Чтобы все необходимые зависимости имелись заранее, go mod download запускается до go build.
Встроенный инструмент go mod tidy

go mod tidy

go mod tidy  —  вспомогательный инструмент системы модулей Go для поддержания чистой, последовательной структуры зависимостей проекта.

Внимание: при выполнении go mod tidy в файлы go.mod и go.sum вносятся изменения, которые рекомендуется просматривать перед фиксацией.

Основные идеи

Сопровождение модулей. В файле go.mod точно отображаются зависимости, фактически задействуемые в коде.

Удаление устаревших зависимостей. Выявляются и удаляются записи модулей, не используемые в файлах go.mod и go.sum.

Обновления зависимостей. Недостающие модули получаются, имеющиеся зависимости обновляются до минимально необходимых версий.

Пример

# Приводятся в порядок зависимости модулей текущего проекта
go mod tidy

Когда использовать

  • Регулярно. go mod tidy интегрируется в рабочий процесс разработки, так файл go.mod поддерживается в оптимальном состоянии.
  • После серьезных изменений. Запускается после добавления или удаления важного кода, так обеспечивается синхронизация зависимостей.
  • Для устранения неполадок. Применением go mod tidy иногда разрешаются связанные с модулями конфликты или несоответствия.
Встроенный инструмент go mod verify

go mod verify

Этим инструментом обеспечиваются валидность, доступность для загрузки перечисленных в файле go.mod проекта зависимостей, наличие в них ожидаемого содержимого.

Основные идеи

Проверка зависимостей. Проверяется наличие в указанных версиях необходимых зависимостей, содержимое которых подтверждается по контрольной сумме в go.sum.

Обеспечение целостности. Снижением риска неожиданных изменений внешних зависимостей гарантируется воспроизводимость проекта.

Пример

# В каталоге проекта
go mod verify


# Вывод:
# В случае успеха — all modules verified («Все модули проверены»)
# Если обнаружены проблемы — сообщения об ошибках, где указывается, что́ не так с конкретными зависимостями.

Когда использовать

  • После изменения зависимостей. Каждый раз, когда меняются версии или добавляются/удаляются зависимости в файле go.mod.
  • До развертывания. В качестве проверки перед развертыванием этим инструментом обеспечивается, что проект с указанными зависимостями собирается корректно.
  • При регулярных проверках. Чтобы проводить постоянные проверки зависимостей, go mod verify интегрируется в рабочий процесс разработки или в конвейеры непрерывной интеграции и непрерывного развертывания.
Встроенный инструмент go mod vendor

go mod vendor

В проектном каталоге создается папка vendor с локальными копиями всех необходимых зависимостей проекта.

Основные идеи

Независимость. Проект становится независимым от репозиториев внешних модулей.

Воспроизводимость. Обеспечиваются согласованные сборки, поскольку зависимости в проекте поставляются локально / загружаются независимо от внешних изменений.

Оффлайн-разработка. Обеспечивается разработка, при которой для получения зависимостей доступ в интернет не требуется.

Пример

# В каталоге проекта
go mod vendor

Когда использовать

  • В изолированных сборках. Сборка проекта осуществляется всегда с точно такими же зависимостями, невзирая на изменения во внешних репозиториях.
  • В автономных средах. Если проект планируется разрабатывать или развертывать в среде с ограниченным интернет-подключением или без него.
  • Для соответствия требованиям. В средах разработки имеются ограничения на использование источников внешних модулей.
Встроенный инструмент go run

go run

С go run код на Go в один прием и компилируется, и выполняется. Инструмент идеален для быстрого тестирования фрагментов кода, экспериментирования с идеями или запуска небольших скриптов Go.

Основные идеи

Компиляция «под капотом». При выполнении go run код временно компилируется в памяти без создания автономного исполняемого файла.

Быстрое прототипирование. Изменения в коде проходятся быстро и без накладных расходов процесса go build.

Временный характер. Выходного двоичного файла не сохраняется, поэтому инструмент хорош для быстрых задач.

Пример

# Запускается один файл Go
go run main.go

# Запускается код внутри пакета
go run ./mypackage

Когда использовать

  • При экспериментировании. Идеально для тестирования фрагментов кода Go или изучения функциональности пакетов.
  • В простых скриптах. Удобно для выполнения небольших автономных скриптов Go.
  • При разработке и отладке. Приходится кстати для быстрых тестов на этапе разработки.
Встроенный инструмент go test

go test

go test  —  основа автоматизированного тестирования на Go. Корректность и надежность кода обеспечивается этим инструментом благодаря встроенному фреймворку для написания и выполнения модульных тестов.

Основные идеи

Обнаружение тестов. В пакетах Go автоматически выявляются тестовые функции, их названия начинаются на Test, например TestAdd и другие.

Выполнение и отчеты. Запускаемые тесты снабжаются четкими результатами при успехе, сбоях, другой релевантной информацией.

Тестовое покрытие. Чтобы выявлять недостаточно протестированные участки кода, генерируются отчеты о его покрытии go test -cover.

Пример

# Запускаются все тесты в текущем каталоге
go test

# Запускаются тесты для конкретного пакета
go test ./mypackage

# Запускаются тесты с подробным выводом
go test -v

Когда использовать

  • На протяжении всей разработки. Тесты пишутся вместе с кодом. Регулярным выполнением go test повышается качество кода, снижается риск его ухудшения.
  • Для непрерывной интеграции. Чтобы поддерживать высокий уровень надежности кода, go test интегрируется в конвейеры непрерывной интеграции и непрерывного развертывания.
Встроенный инструмент go vet

go vet

go vet  —  встроенное в Go средство статического анализа. Код этим инструментом тщательно сканируется в поисках потенциальных проблем, недостатков, стилистических несоответствий.

Основные идеи

Обнаружение проблем. Наиболее типичные из них: подозрительные конструкции, некорректное форматирование, потенциальные ошибки времени выполнения.

Раннее исправление. Проблемы устраняются на ранней стадии цикла разработки, пока не переросли в баги посерьезнее.

Настраивание. Поддерживаются различные проверки, даже пишутся пользовательские анализаторы.

Пример

# Запускаются рекомендованные vet-проверки текущего пакета
go vet ./...

Когда использовать

  • В рабочем процессе разработки. Чтобы отлавливать ошибки заблаговременно, go vet интегрируется в процесс разработки.
  • Перед просмотром кода. Инструмент запускается для предварительной проверки качества.
  • Для непрерывной интеграции. Чтобы обеспечить соблюдение стандартов качества кода, go vet включается в конвейер непрерывной интеграции и непрерывного развертывания.
Встроенный инструмент go link

go link

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

Основные идеи

Связывание вручную. Объектные файлы и архивы связываются напрямую, обходясь без привычной автоматизации компилятора Go.

Специализированные сборки. Этим инструментом создаются оптимизированные исполняемые файлы, статически связываются библиотеки, тонко настраивается конечный вывод.

Внутренняя операция. go link предназначен в основном для разработчиков самого инструментария Go или тех, у кого очень специфические требования относительно сборки.

Пример

# Объектные файлы «main.o» и «utils.o» связываются в исполняемый файл «myprogram»
go link -o myprogram main.o utils.o

Когда использовать

  • Для обычных целей крайне редко. Прямой контроль go link большинству разработчиков Go не понадобится. С процессами сборки и связывания стандартные инструменты Go справляются, как правило, эффективно.
  • При разработке инструментария. Больше пригодится работающим над компилятором Go или самой системой сборки.
  • При расширенной оптимизации. Потенциальные, но рискованные варианты применения  —  ручная оптимизация производительности, сборки с высокой степенью настройки.
Встроенный инструмент go doc

go doc

С go doc всегда актуальная документация к пакетам Go доступна для чтения прямо с терминала, комментарии извлекаются непосредственно из кода и форматируются.

Основные идеи

Документация у вас под рукой. Не нужно постоянно переключаться между редактором кода и внешним сайтом, чтобы заглянуть в пакет.

Четко и лаконично. Представляется хорошо отформатированная, удобная для чтения документация по пакетам, типам, функциям, константам и многому другому.

Примеры кода. Часто включаются примеры использования, встроенные в комментарии к коду.

Пример

# Показывается документация к пакету «fmt»
go doc fmt

# Просматривается документация к функции «Println» в «fmt»
go doc fmt.Println

# В проекте разыскивается документация к пользовательскому типу
go doc mypackage.MyCustomType

Когда использовать

  • При изучении новых пакетов. Быстро понимаются назначение и применение пакетов, с которыми раньше не работали.
  • Для напоминания. Получаются подробные напоминания о конкретных функциях или типах, даже в собственном коде.
  • Оффлайн-доступ. Идеально для ознакомления с документацией Go, когда подключение к интернету затруднено.

Выходные данные go doc отображаются и в HTML  —  для просмотра в браузере. Для еще более мощных навигации и поиска воспользуйтесь специальными инструментами, например godoc.org или запускаемым локально сервером godoc.

Встроенный инструмент go version

go version

С go version быстро определяется установленная в системе версия Go. Эта информация важна для проверки совместимости, устранения неполадок.

Основные идеи

Сведения о версии. Отображается конкретная версия выпуска Go, например go1.19.5, а также сведения об операционной системе и архитектуре.

Контроль совместимости. Код собирается и тестируется в той же версии Go, на которой запустится в продакшене.

Помощь в устранении неполадок. При обращении за помощью или сообщении о багах предоставляется полезная информация о версии.

Пример

# Проверяется версия Go 
go version

Когда использовать

  • При настройке проекта. Проверяется наличие требуемой для конкретного проекта версии Go.
  • При совместном использовании среды. Вывод go version указывается при предоставлении конфигурации другим участникам или проблемах с поддержкой.
  • После обновлений. Подтверждается успешная установка или переход на новую версию Go.

Заключение

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

Благодаря их интеграции и акценту на продуктивности укрепляется репутация Go как языка, нацеленного на быстрые результаты. Освоив встроенные инструменты, разработчик  —  опытный или начинающий  —  раскроет свой потенциал, создавая элегантные и надежные приложения Go.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Taras Sahaidachnyi: Native Golang Tools

Предыдущая статьяОсвоение различных видов линий в Jetpack Compose с помощью PathEffect
Следующая статьяПсевдоним типа в Swift