Справочник

Инструменты — справочник

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 modinit, tidy, download, vendor, graph, why, edit, verify
go workinit, 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, -fuzztimefuzzing и его длительность
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. Первоисточники