13. Build, Modules, & Tooling
Ship reproducible builds; manage private modules; wire linters/tests in CI; embed assets cleanly.
Question: How do you work with private modules?
Answer: Set GOPRIVATE=github.com/yourorg/*
, configure credentials (git/SSH), and optionally bypass proxy/sumdb for those modules.
Explanation: This ensures module downloads go directly to your VCS and prevents checksum DB leakage of private paths.
Question: When would you use
replace
and vendoring?
Answer: Use replace
for local development overrides or pinning forks; use vendoring for hermetic builds or restricted environments.
Explanation: Both are tooling controls to improve build reproducibility when needed.
Question: What belongs in a Go CI pipeline?
Answer: go vet
, golangci-lint
/staticcheck
, govulncheck
, unit tests with -race
, coverage thresholds, and go mod tidy
checks.
Explanation: These steps catch correctness, security, and drift issues early.
Question: How do you embed static assets into a Go binary?
Answer: Use //go:embed
to embed files or directories into the binary.
Explanation: Embedded assets are exposed via embed.FS
(implements fs.FS
) and can be served with net/http
or used by html/template
.
import "embed"
//go:embed templates/*.html
var templatesFS embed.FS
// http.Handle("/", http.FileServer(http.FS(templatesFS)))
Question: How do you inject build-time variables into a Go binary?
Answer: Use linker flags: -ldflags "-X pkgpath.var=value"
on a package‑level string variable.
Explanation: Common for version, commit, and build date.
# main.go
# var version = "development"
go build -ldflags "-X main.version=$(git rev-parse --short HEAD)"
Question: What is
go generate
and when should you use it?
Answer: go generate
runs generator commands specified by //go:generate
comments.
Explanation: Use it for code generation (mocks, stringers, assets). Keep it reproducible and documented.
Question: What are module proxies, sumdb, and workspaces?
Answer: The module proxy caches modules; the checksum DB (sum.golang.org
) verifies content; workspaces (go work
) manage multi-module repos.
Explanation: Configure GOPROXY
, GOSUMDB
, and use go work use ./...
to develop across modules.
Question: What is Minimal Version Selection (MVS)?
Answer: MVS picks the minimum required version of each module that satisfies all requirements, avoiding SAT solving.
Explanation: Upgrading a module raises versions only along that path; others stay at their minimums unless required.