Irbisa · Шпаргалка
Модули, сборка и тулинг
go.mod и MVS, build-теги, embed, ldflags, линтеры, статические бинарники
Что такое
GOROOTиGOPATHи почему с появлением модулейGOPATHзначит гораздо меньше?Чем пакет отличается от модуля в Go?
Что хранят
go.modиgo.sumи какой из них решает, какие версии зависимостей попадут в сборку?// go.mod: which versions are builtmodule github.com/acme/billing go 1.25 require (…Что делает
go mod tidy, чемgo getотличается от ручной правкиgo.modи что проверяетgo mod verify?Что значит пометка
// indirectу строкиrequireвgo.modи почему в современномgo.modтаких строк так много?// go.mod of a go 1.17+ module: two require blocksmodule github.com/acme/billing go 1.25 require (…Как сегодня установить консольную Go-утилиту вроде
mockgenи почемуgo getбольше не даёт бинарник?# wrong since Go 1.18: adds a requirement to go.mod, builds nothing$ go get go.uber.org/mock/mockgen$ mockgen -versionzsh: command not found: mockgen # right: build a pinned version into $GOBIN, ignoring the current go.mod…Что делает
go generate, почемуgo buildникогда его не запускает и нужно ли коммитить сгенерированные файлы?package order //go:generate go tool stringer -type=Status type Status int…Что ловят
gofmt,go vet,staticcheckиgolangci-lintи как запускать их в CI?# .golangci.yml (golangci-lint v2)version: "2" linters: default: standard # errcheck, govet, ineffassign, staticcheck, unused enable:…Как документировать Go-код и как выглядят doc-комментарии и команда
go doc?// Package billing charges customers and issues invoices.package billing import "errors" // ErrDeclined is returned when the card is refused.…Какая версия
golang.org/x/netпопадёт в сборку при таких требованиях и почему Go не нужен lock-файл, чтобы она не менялась?// your go.mod (without the // indirect lines tidy would add)require ( github.com/acme/kit v1.3.0 github.com/acme/api v0.9.0) // kit v1.3.0's go.mod: require golang.org/x/net v0.28.0// api v0.9.0's go.mod: require golang.org/x/net v0.31.0 // newest x/net on the proxy today: v0.45.0Зачем модулю v2 нужен
/v2в пути модуля и что сломается, если поставить тегv2.0.0, не поменяв путь?// the library's go.mod, from v2 on:// module github.com/acme/lib/v2 package main import (…Ваша библиотека обходит сломанную зависимость через
replaceв своёмgo.mod, но сервисы, импортирующие библиотеку, всё равно получают сломанную версию. Почему?Как заставить Go скачивать приватные модули из корпоративного Git и как связаны
GOPROXY,GOPRIVATEи вендоринг?# wrong: a private path goes to the public mirror and checksum DB$ go get git.corp.example/team/lib@v1.2.0verifying module: git.corp.example/team/lib@v1.2.0: reading https://sum.golang.org/lookup/...: 410 Gone # right: one variable covers GONOPROXY and GONOSUMDB for these prefixes$ go env -w GOPRIVATE='git.corp.example/*,github.com/acme/*'…Что задаёт строка
goвgo.modи как строкаtoolchainиGOTOOLCHAINрешают, какой Go на самом деле соберёт код?// go.modmodule github.com/acme/billing go 1.24.0 // language version + minimum toolchaintoolchain go1.25.3 // preferred toolchain when this is the main module…Как зафиксировать версии dev-утилит вроде
mockgenилиstringerдля всей команды: старый файлtools.goили директиваtoolиз Go 1.24?# Go 1.24+: record the tool in go.mod$ go get -tool go.uber.org/mock/mockgen@v0.6.0 # go.mod now containstool go.uber.org/mock/mockgen…Как организовать структуру репозитория Go-сервиса и что гарантирует директория
internal?github.com/acme/billing/├── go.mod├── cmd/│ ├── api/main.go // one directory per binary: config + wiring only│ └── worker/main.go└── internal/ // importable only from github.com/acme/billing/...…Почему Go запрещает циклические импорты и как разорвать цикл между двумя вашими пакетами?
package store import ( "context" "database/sql")…Что такое ограничения сборки (
//go:build, суффиксы_linux.go) и как кросс-компилировать Go-бинарник под другую ОС и архитектуру?// file: internal/store/pg_integration_test.go//go:build integration package store import "testing"…Программа собрана с
-ldflags="-X main.version=1.4.0 -X main.commit=abc -X main.buildTime=2026-10-14 -X main.env=prod"и запущена безAPP_ENV. Что она напечатает?package main import ( "fmt" "os") const commit = "none" var version = "dev"var buildTime stringvar env = os.Getenv("APP_ENV") func main() { fmt.Printf("%s %s %s %q\n", version, commit, buildTime, env)}Как написать production-Dockerfile для Go-сервиса и что ломается, когда бинарник запускается на
scratch?# syntax=docker/dockerfile:1FROM golang:1.25 AS buildWORKDIR /srcCOPY go.mod go.sum ./RUN go mod download # cached until go.mod/go.sum changeCOPY . .…Чем
govulncheckотличается от сканера зависимостей, сравнивающего версии, и что он проверяет?Один и тот же коммит собирается на всех ноутбуках, но в CI падает с
no required module provides package, а в репозитории лежитgo.workиз gitignore. Что происходит?// go.work at the repo root: git-ignored here, which is the whole buggo 1.25 use ( ./api ./lib…Два прогона CI на одном коммите дают бинарники с разными хешами. Что делает сборку Go воспроизводимой и как бинарник хранит сведения о своей сборке?
# same commit on two machines: the hashes should match$ CGO_ENABLED=0 go build -trimpath -o app ./cmd/app$ sha256sum app # what the binary says about itself$ go version -m app…Что такое profile-guided optimisation (PGO) в Go, что она на самом деле оптимизирует и как внедрить её в сервис?
# 1. CPU profiles from production, under real traffic$ curl -o cpu-1.pprof 'http://api-1:6060/debug/pprof/profile?seconds=30'$ curl -o cpu-2.pprof 'http://api-2:6060/debug/pprof/profile?seconds=30' # 2. merge them so one instance or one spike does not dominate$ go tool pprof -proto cpu-1.pprof cpu-2.pprof > cmd/api/default.pgo…