Инструменты — справочник
go-команды, модули и workspaces, тесты и fuzzing, бенчмарки, vet и staticcheck, race detector, pprof, delve, сборка и кросс-компиляция.
Собрано из документации Go Modules Reference, go command, Testing, Fuzzing, Go Toolchains и release notes Go 1.21–1.27.
1. go-команды и окружение
| Команда | Что делает |
|---|---|
go build | собирает пакеты и бинарник в текущем каталоге |
go run | собирает и запускает; кэширует результат |
go install | собирает и кладёт бинарник в GOBIN |
go get | добавляет или обновляет зависимости в go.mod |
go mod | init, tidy, download, vendor, graph, why, edit, verify |
go work | init, use, sync, edit |
go test | тесты, бенчмарки, fuzzing, покрытие |
go vet | анализ кода на типовые ошибки |
go fix | модернизация кода: обновление идиом и API [1.26] |
go generate | выполняет //go:generate директивы |
go tool | запускает инструменты из тулчейна и из tool-директив модуля [1.24] |
go env | показывает и меняет переменные окружения Go |
go version -m ./bin | модули и версии, вшитые в бинарник |
GOTOOLCHAIN управляет выбором тулчейна. Начиная с Go 1.21 строка go в go.mod — строгий минимум: если модулю нужна более новая версия, go скачает и запустит её. GOTOOLCHAIN=local запрещает переключение, GOTOOLCHAIN=go1.27.0 фиксирует версию.
go env GOMOD GOPATH GOBIN GOTOOLCHAIN
go help mod tidy
go doc fmt.Printf
2. Модули и версии
Модуль — набор пакетов с общим go.mod. Версии зависимостей выбираются по принципу минимальной версии (MVS): побеждает самая высокая из минимально требуемых, а не самая свежая.
module example.com/billing
go 1.27
toolchain go1.27.0
require (
github.com/jackc/pgx/v5 v5.12.0
golang.org/x/sync v0.19.0
)
require github.com/jackc/puddle/v2 v2.2.2 // indirect
replace example.com/legacy => ../legacy
tool golang.org/x/tools/cmd/stringer
| Директива | Смысл |
|---|---|
module | импортный путь модуля |
go | минимальная версия языка; влияет на поведение и GODEBUG |
toolchain | рекомендуемый тулчейн, может быть новее go |
require | зависимость и минимальная версия |
replace | подменить модуль или версию локальным путём |
exclude | исключить версию из выбора |
retract | объявить свои версии отозванными |
tool | исполняемая зависимость; запускается go tool [1.24] |
go mod tidy приводит go.mod и go.sum в соответствие с импортами. С Go 1.23 есть go mod tidy -diff: показать изменения и не писать файлы. С Go 1.27 для модулей с go 1.27 tidy схлопывает дублирующиеся блоки require в два: прямые и косвенные.
go mod init example.com/billing
go mod tidy -diff
go get github.com/jackc/pgx/v5@v5.12.0
go get -u ./...
go get -tool golang.org/x/tools/cmd/stringer
go install tool
go mod why -m golang.org/x/sync
go mod graph | head
Приватные модули: GOPRIVATE задаёт шаблоны путей, для которых не используются публичные прокси и проверка sumdb; GONOPROXY и GONOSUMDB уточняют поведение по отдельности. GOAUTH [1.24] настраивает аутентификацию для закрытых хостов.
3. Workspaces
Workspace объединяет несколько модулей в одну сборку без replace на каждый. Файл go.work лежит над модулями и действует, пока GOWORK не указывает на другой файл или off.
go work init ./api ./worker ./shared
# go.work
go 1.27
use (
./api
./worker
./shared
)
| Команда | Что делает |
|---|---|
go work init | создаёт go.work с перечисленными модулями |
go work use ./path | добавляет модуль в workspace |
go work sync | переносит выбранные версии из workspace в go.mod модулей |
go work edit | правит go.work из командной строки |
go.work обычно не коммитят: он описывает локальную раскладку каталогов. В CI собирают модули по отдельности или генерируют workspace явно.
4. Тесты
Тест — функция TestXxx(t *testing.T) в файле _test.go. Пакет теста может быть тем же (package store) или внешним (package store_test); внешний видит только экспортированное.
| Флаг | Что делает |
|---|---|
-run | фильтр по имени теста или подтеста |
-v | подробный вывод |
-count=1 | отключить кэш результатов |
-shuffle=on | случайный порядок тестов |
-cover, -coverprofile | покрытие и файл профиля |
-timeout | предел на весь пакет, по умолчанию 10 минут |
-race | детектор гонок |
-bench, -benchmem | бенчмарки и аллокации |
-fuzz, -fuzztime | fuzzing и его длительность |
func TestParseAmount(t *testing.T) {
tests := []struct {
name string
in string
want int64
wantErr bool
}{
{"целое", "42", 42, false},
{"пусто", "", 0, true},
{"буквы", "abc", 0, true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
got, err := ParseAmount(tt.in)
if (err != nil) != tt.wantErr {
t.Fatalf("err = %v, wantErr %v", err, tt.wantErr)
}
if got != tt.want {
t.Fatalf("got %d, want %d", got, tt.want)
}
})
}
}
| Помощник | Зачем |
|---|---|
t.Run | подтест с собственным именем и жизненным циклом |
t.Parallel | разрешить параллельный запуск подтеста |
t.Helper | убрать обёртку из номера строки в отчёте |
t.Cleanup | освобождение после теста, в обратном порядке |
t.TempDir | временный каталог, удаляемый автоматически |
t.Setenv | переменная окружения на время теста |
t.Deadline | дедлайн теста для собственных таймаутов |
TestMain | общая настройка пакета до и после тестов |
Примеры (ExampleXxx) проверяются go test: комментарий // Output: задаёт ожидаемый вывод.
func ExampleCut() {
before, after, _ := strings.Cut("a=b", "=")
fmt.Println(before, after)
// Output: a b
}
5. Fuzzing
Fuzz-тест объявляется как FuzzXxx(f *testing.F). Семена добавляют f.Add, тело проверки — f.Fuzz. Генератор сам подбирает входы, а найденный падающий пример сохраняется в testdata/fuzz и дальше запускается как обычный тест.
func FuzzParseAmount(f *testing.F) {
f.Add("42")
f.Add("")
f.Add("-7")
f.Fuzz(func(t *testing.T, s string) {
got, err := ParseAmount(s)
if err != nil {
return
}
if got < 0 && !strings.HasPrefix(s, "-") {
t.Fatalf("negative result for %q", s)
}
})
}
go test -fuzz=FuzzParseAmount -fuzztime=30s ./...
go test -run=FuzzParseAmount ./... # только сохранённые примеры
За один запуск исполняется один fuzz-таргет. Fuzzing не заменяет примеры и табличные тесты: он ищет неожиданные входы, а не проверяет сценарии.
6. Бенчмарки
Бенчмарк — BenchmarkXxx(b *testing.B). Каркас вызывает функцию несколько раз, подбирая b.N так, чтобы измерение было устойчивым. Внутри цикла не должно быть подготовки, которую не надо измерять.
func BenchmarkParseAmount(b *testing.B) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
_, _ = ParseAmount("12345")
}
}
func BenchmarkEncode(b *testing.B) {
data := buildPayload()
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = encode(data)
}
}
| Флаг | Что делает |
|---|---|
-bench . | запустить все бенчмарки |
-benchmem | показать аллокации и байты на операцию |
-benchtime=5s | длительность измерения |
-count=5 | повторить для оценки разброса |
-cpu=1,4 | запустить с разным GOMAXPROCS |
go test -bench . -benchmem -count=5 | tee bench.txt
benchstat bench.txt
benchstat — отдельный инструмент golang.org/x/perf/cmd/benchstat; он сравнивает два набора и показывает, значимо ли изменение. Один прогон бенчмарка ничего не доказывает.
7. Статический анализ
| Инструмент | Что ловит |
|---|---|
go vet | типовые ошибки: printf, copylocks, loopclosure, lostcancel, structtag, unreachable, nilfunc, stdversion [1.23], waitgroupgo [1.27], hostport [1.25] |
staticcheck | ошибки (SA), упрощения (S), стиль (ST), быстрые исправления (QF) |
golangci-lint | агрегатор линтеров с единым конфигом .golangci.yml |
govulncheck | известные уязвимости в зависимостях и вызовах |
go fix | модернизация кода и API-миграции [1.26] |
gofmt, goimports | форматирование и порядок импортов |
go vet ./...
staticcheck ./...
golangci-lint run ./...
govulncheck ./...
gofmt -l .
go fix ./...
go vet входит в тулчейн и запускается в go test для части проверок. staticcheck и golangci-lint ставятся отдельно; версия линтера фиксируется в CI, иначе новые правила внезапно ломают сборку.
8. Race detector
Детектор гонок встроен в тулчейн и включается флагом -race. Он находит конфликтующие обращения, которые реально произошли во время запуска; ненайденная гонка не означает, что её нет.
go test -race ./...
go run -race ./cmd/api
go build -race -o api-race ./cmd/api
| Свойство | Значение |
|---|---|
| замедление | в разы; память тоже растёт |
| платформы | darwin, linux, windows на поддерживаемых архитектурах |
| cgo | для -race обычно нужен C-тулчейн |
| CI | отдельный прогон go test -race ./... |
9. Профилирование и отладка
| Инструмент | Зачем |
|---|---|
go test -cpuprofile | профиль CPU из теста или бенчмарка |
go test -memprofile | профиль памяти |
go test -trace | трассировка планировщика и горутин |
go tool pprof | разбор профиля, в том числе в браузере |
go tool trace | временная шкала выполнения |
dlv debug, dlv test, dlv attach | отладчик Delve: точки останова, шаги, переменные |
go tool nm, go tool objdump | символы и дизассемблер |
go test -bench . -cpuprofile cpu.out -memprofile mem.out
go tool pprof -http=:8080 cpu.out
dlv debug ./cmd/api
dlv test ./internal/store
Профили и трассировку подробно разбирает лист «Рантайм». Здесь важно правило: сначала измерение, потом оптимизация. «На глаз» узкое место находят неверно почти всегда.
10. Сборка и релиз
Build constraints задаются директивой //go:build в начале файла; несколько условий объединяются &&, || и !. Флаг -tags включает дополнительные метки.
//go:build linux && amd64
package platform
go build -tags=integration ./...
| Флаг | Что делает |
|---|---|
-o | имя выходного файла |
-ldflags="-s -w" | убрать таблицы символов и отладочную информацию |
-ldflags="-X main.version=1.2.3" | подставить строковую переменную |
-trimpath | убрать локальные пути из бинарника |
-buildvcs=false | не вшивать информацию VCS |
-race | сборка с детектором гонок |
CGO_ENABLED=0 | статическая сборка без cgo |
GOOS, GOARCH | целевая платформа |
go tool dist list | grep linux
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -trimpath \
-ldflags="-s -w -X main.version=$(git describe --tags)" \
-o bin/api ./cmd/api
С Go 1.24 go build сам вшивает версию main-модуля из тега или коммита VCS и добавляет суффикс +dirty при незакоммиченных изменениях. Отключить это можно -buildvcs=false.
go version -m bin/api
Для воспроизводимой сборки фиксируют версию Go, зависимости в go.sum, -trimpath и отсутствие локальных replace. go:embed вшивает статические файлы в бинарник; подробности — в листе «Стандартная библиотека».
11. Первоисточники
- go command — все подкоманды и флаги
- Go Modules Reference —
go.mod, MVS,replace,retract,tool - Go Toolchains —
GOTOOLCHAIN, переключение версий - Testing — тесты, примеры, покрытие
- Fuzzing —
FuzzXxx, корпус,-fuzztime - pkg.go.dev/testing —
T,B,F,Run,Cleanup - pkg.go.dev/cmd/vet — анализаторы
go vet - staticcheck.dev — проверки SA, S, ST, QF
- govulncheck — поиск уязвимостей
- Delve — отладчик
- Release notes Go 1.21 —
goкак строгий минимум, автоматический выбор тулчейна - Release notes Go 1.24 —
tool-директива,go get -tool,go build -json - Release notes Go 1.26 — переписанный
go fix - Release notes Go 1.27 —
go mod tidyсхлопывает блокиrequire