Благодаря фантастическому набору встроенных инструментов, Go позволяет разработчикам с легкостью писать, создавать и тестировать проекты, а также управлять ими. Усовершенствуем работу с кодом, изучив этот инструментарий.
Вот краткая характеристика всех инструментов:
Познакомимся с ними подробнее.
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 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. Им интеллектуально выявляются, удаляются объектные и временные файлы, другие артефакты, сгенерированные в процессе сборки.
Основные идеи
Гигиена рабочей области. Упрощаются проектные каталоги, облегчаются навигация и управление кодом.
Оптимизация сборки. За счет уменьшения объема работы компилятора время сборки в больших проектах потенциально сокращается.
Новый старт. Перед большими сборками или при устранении проблем компиляции все начинается с чистого листа.
Пример
# Очищается текущий каталог проекта
go clean
# Очищается и удаляется весь кэш сборки Go
go clean -cache
# Показывается, что́ очистится, без фактического удаления чего-либо.
go clean -n
Когда использовать
- Периодически.
go clean
включается в рабочий процесс разработки для поддержания порядка в структуре проекта. - Перед распространением. С
go clean
подготавливаются упрощенные файлы проекта для совместного использования или развертывания. - Для устранения неполадок.
go clean
выполняют при возникновении неожиданных ошибок сборки, так иногда устраняются проблемы, вызванные устаревшими артефактами сборки.
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 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. Им загружаются конкретные версии зависимостей проекта, как определено в файлах 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 для поддержания чистой, последовательной структуры зависимостей проекта.
Внимание: при выполнении
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
проекта зависимостей, наличие в них ожидаемого содержимого.
Основные идеи
Проверка зависимостей. Проверяется наличие в указанных версиях необходимых зависимостей, содержимое которых подтверждается по контрольной сумме в go.sum
.
Обеспечение целостности. Снижением риска неожиданных изменений внешних зависимостей гарантируется воспроизводимость проекта.
Пример
# В каталоге проекта
go mod verify
# Вывод:
# В случае успеха — all modules verified («Все модули проверены»)
# Если обнаружены проблемы — сообщения об ошибках, где указывается, что́ не так с конкретными зависимостями.
Когда использовать
- После изменения зависимостей. Каждый раз, когда меняются версии или добавляются/удаляются зависимости в файле
go.mod
. - До развертывания. В качестве проверки перед развертыванием этим инструментом обеспечивается, что проект с указанными зависимостями собирается корректно.
- При регулярных проверках. Чтобы проводить постоянные проверки зависимостей,
go mod verify
интегрируется в рабочий процесс разработки или в конвейеры непрерывной интеграции и непрерывного развертывания.
go mod vendor
В проектном каталоге создается папка vendor
с локальными копиями всех необходимых зависимостей проекта.
Основные идеи
Независимость. Проект становится независимым от репозиториев внешних модулей.
Воспроизводимость. Обеспечиваются согласованные сборки, поскольку зависимости в проекте поставляются локально / загружаются независимо от внешних изменений.
Оффлайн-разработка. Обеспечивается разработка, при которой для получения зависимостей доступ в интернет не требуется.
Пример
# В каталоге проекта
go mod vendor
Когда использовать
- В изолированных сборках. Сборка проекта осуществляется всегда с точно такими же зависимостями, невзирая на изменения во внешних репозиториях.
- В автономных средах. Если проект планируется разрабатывать или развертывать в среде с ограниченным интернет-подключением или без него.
- Для соответствия требованиям. В средах разработки имеются ограничения на использование источников внешних модулей.
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. Корректность и надежность кода обеспечивается этим инструментом благодаря встроенному фреймворку для написания и выполнения модульных тестов.
Основные идеи
Обнаружение тестов. В пакетах 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 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 доступна для чтения прямо с терминала, комментарии извлекаются непосредственно из кода и форматируются.
Основные идеи
Документация у вас под рукой. Не нужно постоянно переключаться между редактором кода и внешним сайтом, чтобы заглянуть в пакет.
Четко и лаконично. Представляется хорошо отформатированная, удобная для чтения документация по пакетам, типам, функциям, константам и многому другому.
Примеры кода. Часто включаются примеры использования, встроенные в комментарии к коду.
Пример
# Показывается документация к пакету «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. Эта информация важна для проверки совместимости, устранения неполадок.
Основные идеи
Сведения о версии. Отображается конкретная версия выпуска Go, например go1.19.5
, а также сведения об операционной системе и архитектуре.
Контроль совместимости. Код собирается и тестируется в той же версии Go, на которой запустится в продакшене.
Помощь в устранении неполадок. При обращении за помощью или сообщении о багах предоставляется полезная информация о версии.
Пример
# Проверяется версия Go
go version
Когда использовать
- При настройке проекта. Проверяется наличие требуемой для конкретного проекта версии Go.
- При совместном использовании среды. Вывод
go version
указывается при предоставлении конфигурации другим участникам или проблемах с поддержкой. - После обновлений. Подтверждается успешная установка или переход на новую версию Go.
Заключение
Философия простоты и эффективности Go прекрасно распространяется на встроенный инструментарий этого языка. От сборки исполняемых файлов с go build
до управления зависимостями с go mod
и даже изучения документации с go doc
— практически все этапы разработки совершенствуются модернизированными командами Go.
Благодаря их интеграции и акценту на продуктивности укрепляется репутация Go как языка, нацеленного на быстрые результаты. Освоив встроенные инструменты, разработчик — опытный или начинающий — раскроет свой потенциал, создавая элегантные и надежные приложения Go.
Читайте также:
- WebAssembly с Go: вывод веб-приложений на новый уровень
- Лучшие практики для эффективного кода на Golang. Часть 1
- Обзор итераторов в Go
Читайте нас в Telegram, VK и Дзен
Перевод статьи Taras Sahaidachnyi: Native Golang Tools