Golang Architecture
Priority: P0 (CRITICAL)
Rules
- Package-first design: organize by domain/capability before package-by-layer sprawl.
- Layout:
cmd/for binaries,internal/for private app code,pkg/only for intentional reuse. - Wiring: compose dependencies in
mainor dedicated constructors, not via hidden globals. - Interfaces: define small interfaces on the consumer side.
- Context: pass
context.Contextacross I/O and request boundaries.
Recipe
- Place the entrypoint in
cmd/<app>. - Create domain-owned packages under
internal/. - Expose constructors for services, repositories, and handlers.
- Keep business rules out of transport packages.
- Wire logging, config, DB, and HTTP server at startup.
Verify
- [ ] No package-level mutable singletons control runtime behavior.
- [ ] Imports flow inward; transport and storage packages do not pull business rules outward.
- [ ] Interfaces live with callers that need substitution.
- [ ]
mainwires dependencies but does not hold business logic. - [ ] Request and DB paths accept
context.Context.
Anti-Patterns
- No package soup: avoid dumping unrelated code into
internal/sharedorpkg/utils. - No global singletons: use constructors; avoid package-level mutable variables.
- No god services: split orchestration by capability.
- No fake Clean Architecture theatre: package names must match real ownership.