--- name: go-conventions description: Carlos Becker's Go implementation and review conventions. Use when writing or reviewing Go in caarlos0, GoReleaser, nFPM, env, svu, fang, and related projects. --- # Go Conventions Follow repository instructions first. Prefer idiomatic, unsurprising Go with a small public surface and few dependencies. - Use the standard library unless a dependency provides clear, necessary value. Every new `require` in `go.mod` needs justification. - Wrap errors with context using `%w`; use `errors.Is` and `errors.As`. Error messages are lowercase, have no trailing punctuation, and say what failed. - Put implementation details in `internal/`. Define interfaces at the consumer and add generics or functional options only when concrete callers need them. - For CLIs, follow existing Cobra and fang patterns rather than introducing a second framework. - Use struct tags for declarative configuration when the repository already follows that pattern. - Write surgical regression tests with `testify/require`. Use per-case `t.Run`; use tables only when cases genuinely share a shape. Keep decisive assertions at the failing test line rather than hiding them in helpers. - Discover and use repository `make` targets such as `test`, `lint`, `build`, and `ci`; do not assume they exist. - Keep release and container changes reproducible. Follow existing GoReleaser configuration and pin container images to digests when that is the repository convention. Run `gofmt` and the repository's existing targeted tests and lint commands. Do not add retries, timeouts, abstractions, or compatibility layers without a demonstrated problem.