Команда 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-інструментів від сторонніх розробників.
Суфікс @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 як збої збирання.
З досвіду 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).
Ключові змінні:
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 скомпільовано наявний бінарний файл:
З досвіду Python: ≈
python --version. Друга форма (читання бінарного файлу) не має аналога в Python.
go list¶
Друкує метадані про пакети або модулі. Легко скриптується через шаблони Go.
go list ./... # кожен пакет у модулі
go list -m all # кожен модуль у графі залежностей
go list -m -u all # показати доступні оновлення
go list -f '{{.ImportPath}}' ./... # власний формат
З досвіду Python: форми з
-m≈pip list/pip list --outdated. Форма без-m(перелік пакетів усередині поточного проекту) не має прямого аналога — це ближче до обходуpkgutil.iter_modules.
go doc¶
Друкує документацію для пакету, типу, функції або змінної безпосередньо з вихідного коду.
З досвіду 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. Все інше з'являється, коли виникає конкретна потреба.