.claude/skills/go-backend-best-practices/SKILL.md
Go backend patterns from Uber style and standard layout
npx skillsauth add baekenough/oh-my-customcode go-backend-best-practicesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Apply Go backend patterns for building production-ready services.
layout: "cmd/{server/main.go} + internal/{handler/,service/,repository/,model/} + pkg/{shared/} + api/{openapi.yaml} + configs/ + scripts/"
directories:
cmd: Main applications (one per binary)
internal: Private application code
pkg: Library code safe for external use
api: API definitions (OpenAPI, protobuf)
configs: Configuration files
scripts: Build and CI scripts
Reference: guides/go-backend/project-layout.md
principles:
- Wrap errors with context using %w
- Handle errors once (don't log AND return)
- Use sentinel errors for specific conditions
- Name error variables with Err prefix
patterns:
sentinel: "var ErrNotFound = errors.New(\"not found\")"
wrapping: "fmt.Errorf(\"getUser %s: %w\", id, err)"
checking: "errors.Is(err, ErrNotFound)"
Reference: guides/go-backend/uber-style.md
channels:
size: "Use 0 (unbuffered) or 1 only"
larger: "Requires careful review"
goroutines:
never: fire-and-forget
always: wait for completion or manage lifecycle
patterns: "sync.WaitGroup + error channel for parallel work; context.Context for cancellation"
Reference: guides/go-backend/uber-style.md
structure:
handler: HTTP layer (request/response)
service: Business logic
repository: Data access
patterns:
dependency_injection: "Handler struct with service field, constructor NewXxxHandler()"
router: "chi.NewRouter() with middleware (Logger, Recoverer) and versioned routes"
error_mapping: "errors.Is() to map domain errors to HTTP status codes"
Reference: guides/go-backend/uber-style.md
approach: constructor injection
avoid: global variables
pattern: "Struct with dependencies as fields, New* constructor functions, wire up in main()"
Reference: guides/go-backend/uber-style.md
approach:
- Use environment variables
- Validate at startup
- Group related settings
pattern: "Config struct with nested typed configs, env struct tags, Parse at startup"
Reference: guides/go-backend/uber-style.md
patterns:
table_driven: for comprehensive coverage
interfaces: for mocking
parallel: for speed
tools: "gomock for mocks, cmp.Diff for assertions"
Reference: guides/go-backend/uber-style.md
guidelines:
- Use strconv over fmt for conversions
- Pre-allocate slices with known capacity
- Avoid repeated string-to-byte conversions
- Copy slices/maps at boundaries
Reference: guides/go-backend/uber-style.md
When writing Go backend code:
development
Generate and maintain a persistent codebase wiki — LLM-built interlinked markdown knowledge base (Karpathy LLM Wiki pattern)
development
Use the project wiki as RAG knowledge source — search wiki pages to answer codebase questions before exploring raw files
tools
Analyze task trajectories to propose reusable SKILL.md candidates from successful patterns
data-ai
hada.io RSS feed monitoring for AI agent/harness articles with automated /scout analysis