Перейти до змісту

Команда go — довідник підкоманд

Команда go — це головний інструмент для всього робочого процесу в Go. Один виконуваний файл відповідає за компіляцію, запуск, тестування, форматування, статичний аналіз, управління залежностями, документацію тощо.

Виконайте go help, щоб отримати повний список підкоманд, та go help <subcommand> для деталей щодо кожної з них.

Збирання та запуск коду

go run

Компілює та запускає Go-програму за один крок. Бінарний файл записується у тимчасове місце й видаляється після виконання. Використовуйте для швидких експериментів.

go run .                    # запустити пакет у поточній директорії
go run main.go              # запустити один файл
go run ./cmd/server         # запустити пакет за вказаним шляхом

З досвіду Python: приблизно як python script.py — але Go завжди спочатку компілює, а потім запускає. Режиму інтерпретатора немає.

go build

Компілює у бінарний файл у поточній директорії (або за шляхом, вказаним через -o). Не запускає. Результуючий бінарний файл є статично скомпільованим — не потрібно встановлювати Go runtime на цільовій машині.

go build                    # створити ./<name>
go build -o bin/app .       # власний шлях виводу
go build ./...              # зібрати кожен пакет у модулі

Поширені прапорці:

  • -o <path> — шлях до вихідного файлу.
  • -race — увімкнути детектор перегонів даних (data race detector; додає ~5–10× накладних витрат пам'яті під час виконання).
  • -tags <tag> — увімкнути build-теги.
  • -ldflags '...' — прапорці для компонувальника (linker); зазвичай використовуються для вбудовування рядків версій, наприклад -ldflags "-X main.Version=$(git rev-parse HEAD)".

З досвіду Python: прямого аналога немає. Найближче — pyinstaller/shiv/pex, але збирання в Go є першокласною операцією і дає єдиний статичний бінарний файл із вбудованим runtime.

go install

Збирає бінарний файл і встановлює його в $GOBIN (за замовчуванням $HOME/go/bin). Призначено для встановлення CLI-інструментів від сторонніх розробників.

go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

Суфікс @version (або @latest) є обов'язковим при виконанні поза модулем. Додайте $GOBIN до $PATH, щоб викликати встановлені інструменти.

З досвіду Python:pipx install <package> — розміщує CLI-інструмент десь у $PATH, не забруднюючи залежності проекту.

Залежності та модулі

go mod init <module-path>

Створює новий файл go.mod. Шлях модуля також є шляхом імпорту, за яким інший код посилається на цей модуль. Для навчальних проектів підійде будь-який шлях: example.com/hello.

З досвіду Python:poetry init або hatch new — створює маніфест проекту. Немає аналога розгалуженого [tool.<thing>] у pyproject.toml; go.mod є компактним і уніфікованим.

go mod tidy

Синхронізує go.mod із реально використовуваними імпортами в коді: додає відсутні залежності, видаляє невикористані, оновлює go.sum. Запускайте щоразу, коли змінюються імпорти.

З досвіду Python:poetry lock або pip-compile, але керується фактичними операторами import у вашому коді, а не окремим requirements.in.

go mod download

Попередньо завантажує модулі в локальний кеш без збирання. Корисно в CI, коли хочете відокремити завантаження залежностей від компіляції.

go mod why <pkg>

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

З досвіду Python:pipdeptree --reverse --packages <pkg>.

go mod graph

Друкує повний граф залежностей модуля у вигляді ребер.

З досвіду Python:pipdeptree (звичайний вивід).

go mod vendor

Копіює всі залежності в локальну директорію vendor/. Наступні збирання використовуватимуть вендоровані копії замість $GOMODCACHE. Корисно для ізольованих або повністю відтворюваних збирань. Необов'язково.

go get

Додає, оновлює або знижує версію залежності в go.mod. go get лише управляє залежностями — він не встановлює CLI-бінарні файли (це завдання go install).

go get github.com/some/pkg                  # додати найновішу версію
go get github.com/some/pkg@v1.2.3           # зафіксувати версію
go get -u ./...                             # оновити всі залежності до останнього мінорного/патч-випуску
go get go@1.23.0                            # змінити версію Go у go.mod

З досвіду Python:poetry add <pkg> — редагує маніфест і оновлює lockfile за один крок. Не схоже на pip install, який лише змінює середовище.

go work

Управляє багатомодульними робочими просторами (workspaces) — коли декілька локальних модулів повинні бачити вихідний код одне одного без директив replace. Підкоманди: go work init, go work use, go work sync.

З досвіду Python: приблизно як pip install -e <local-path> для кількох суміжних проектів, або режим workspace у uv/pdm.

Якість та коректність

go test

Запускає тести з файлів *_test.go. Тестування вбудоване в мову — зовнішній фреймворк не потрібен.

go test ./...                       # всі пакети
go test -v                          # детальний вивід
go test -run TestFoo                # фільтр за назвою тесту (регекс)
go test -race                       # запуск із детектором перегонів даних
go test -cover                      # зведення покриття
go test -coverprofile=c.out         # записати профіль покриття
go test -bench=.                    # також запустити бенчмарки
go test -count=1                    # вимкнути кешування результатів
go test -trace=trace.out            # записати трейс виконання

З досвіду Python:pytest, але постачається разом із мовою — не потрібно встановлювати нічого стороннього, не потрібно вивчати екосистему фікстур/плагінів. Бенчмарки та fuzz-тести є першокласними громадянами, а не окремими інструментами.

go vet

Статичний аналіз для поширених помилок, які компілюються, але, ймовірно, є вадами: невідповідності формату printf, недосяжний код, копіювання м'ютексів (lock copying), підозрілі тіньові змінні тощо. Аналізатори консервативні — хибні спрацьовування (false positives) рідкісні, тому CI зазвичай розглядає збої go vet як збої збирання.

go vet ./...

З досвіду Python:pyflakes — консервативна підмножина того, що могли б знайти pylint/ruff. Налаштований так, щоб майже ніколи не давати хибних спрацьовувань, тому CI розглядає збої як збої збирання.

go fmt / gofmt

Форматує вихідний код Go відповідно до канонічного стилю. Існує один стиль Go — gofmt не має параметрів форматування. Більшість редакторів запускають його автоматично при збереженні.

go fmt ./...                # форматувати всі пакети
gofmt -d file.go            # показати diff без запису
gofmt -s file.go            # застосувати додаткові спрощення

З досвіду Python:black — один канонічний стиль, без параметрів, без суперечок. gofmt з'явився на кілька років раніше за black і став натхненням для нього.

Інспектування

go env

Друкує змінні середовища Go: GOROOT, GOPATH, GOOS, GOARCH, GOMODCACHE, GOPROXY та інші. Використовуйте -w, щоб постійно зберегти значення (записується в $HOME/.config/go/env).

go env                              # вивести все
go env GOPATH                       # одна змінна
go env -w GOPROXY=direct            # зберегти постійно

Ключові змінні:

  • GOROOT — місце встановлення Go toolchain. Зазвичай управляється автоматично.
  • GOPATH —історичний корінь робочого простору; сьогодні переважно містить pkg/mod (кеш) та bin/ (встановлені інструменти).
  • GOMODCACHE — директорія кешу модулів (за замовчуванням $GOPATH/pkg/mod).
  • GOPROXY — URL проксі модулів (за замовчуванням https://proxy.golang.org,direct).
  • GOTOOLCHAIN — управляє вибором версії toolchain (дивіться статтю про керування версіями).
  • GOOS / GOARCH — цільова ОС та архітектура для наступного збирання.

З досвіду Python: приблизно як перевірка python -m sysconfig разом із відповідними PY* змінними середовища — чистого аналога з однією командою немає, бо стан інструментарію Python розподілений між кількома файлами та процесами.

go version

Друкує версію toolchain. Може також повідомити, якою версією Go скомпільовано наявний бінарний файл:

go version
go version ./mybinary

З досвіду Python:python --version. Друга форма (читання бінарного файлу) не має аналога в Python.

go list

Друкує метадані про пакети або модулі. Легко скриптується через шаблони Go.

go list ./...                              # кожен пакет у модулі
go list -m all                             # кожен модуль у графі залежностей
go list -m -u all                          # показати доступні оновлення
go list -f '{{.ImportPath}}' ./...         # власний формат

З досвіду Python: форми з -mpip list / pip list --outdated. Форма без -m (перелік пакетів усередині поточного проекту) не має прямого аналога — це ближче до обходу pkgutil.iter_modules.

go doc

Друкує документацію для пакету, типу, функції або змінної безпосередньо з вихідного коду.

go doc fmt.Println
go doc fmt
go doc -all fmt
go doc -src fmt.Println

З досвіду Python:pydoc fmt.Println. Та сама ідея: читати рядки документації безпосередньо з встановленого вихідного коду.

Крос-компіляція

Go підтримує крос-компіляцію нативно — не потрібно встановлювати окремий toolchain для кожної цілі — за умови, що ви не використовуєте cgo.

GOOS=linux   GOARCH=amd64 go build -o app-linux .
GOOS=darwin  GOARCH=arm64 go build -o app-mac-m1 .
GOOS=windows GOARCH=amd64 go build -o app.exe .

go tool dist list друкує всі підтримувані комбінації ОС та архітектури.

З досвіду Python: реального аналога немає. Python поширює вихідний код і покладається на інтерпретатор цільової платформи; Go виробляє нативний бінарний файл для будь-якої ОС/архітектури на запит, з будь-якого хоста.

Менш поширені, але варті уваги

  • go generate — виконує команди, знайдені в директивах //go:generate всередині вихідних файлів. Використовується для запуску генераторів коду (protobuf, stringer, mockgen). З досвіду Python: ≈ запуск pre-commit-хука кодогенерації або цілі make generate.
  • go tool — точка входу для внутрішніх інструментів: go tool pprof, go tool trace, go tool objdump тощо.
  • go clean — видаляє артефакти збирання; go clean -modcache очищає завантажені модулі. З досвіду Python:rm -rf __pycache__/ build/ dist/ плюс очищення ~/.cache/pip.
  • go bug — відкриває попередньо заповнений звіт про помилку для проекту Go.
  • go fix — переписує старий код для використання новіших API; сьогодні потрібен рідко. З досвіду Python:історичний аналог — 2to3; сучасний — pyupgrade.

80% команд, які ви будете використовувати щодня

go run, go build, go test, go mod tidy, go fmt, go vet, go get, go install, go env. Все інше з'являється, коли виникає конкретна потреба.

Джерела