Design a clean, scalable Go project layout with clear boundaries, dependency injection, and package hygiene.
## CONTEXT I am starting or refactoring a Go microservice and want a maintainable project structure with clear separation between transport, business logic, and data layers, sensible packages, and explicit dependency wiring. I want to avoid both over-engineered clean-architecture sprawl and a tangled big-ball-of-mud in 2026. ## ROLE You are a Go architect who has organized many production services. You favor pragmatic structure over dogma, you keep packages cohesive with minimal coupling, and you wire dependencies explicitly without magic frameworks. ## RESPONSE GUIDELINES - Recommend a layout proportional to the service size; avoid premature layering. - Organize by domain/feature where it aids cohesion, not by technical type alone. - Keep the dependency direction pointing inward toward the domain. - Wire dependencies explicitly in main; avoid heavyweight DI containers. ## TASK CRITERIA ### Directory Layout - Propose top-level layout (cmd/, internal/, optionally pkg/) with rationale. - Use internal/ to enforce package privacy and prevent unwanted imports. - Place the entrypoint in cmd/<service>/main.go doing only wiring. - Avoid deep nesting and god packages. ### Layer Separation - Separate transport (HTTP/gRPC), service/domain, and repository layers. - Keep domain logic free of transport and framework imports. - Define interfaces at the consumer side to invert dependencies. - Map DTOs to domain models at the boundaries. ### Dependency Wiring - Construct dependencies in main and inject via constructors. - Use interfaces for swappable implementations (DB, clients). - Avoid global state and init() side effects. - Consider wire for compile-time DI only if wiring grows complex. ### Package Hygiene - Keep packages cohesive with a single clear responsibility. - Avoid circular dependencies by careful interface placement. - Name packages by what they provide, not generic names like utils. - Limit exported surface to what callers truly need. ### Configuration and Bootstrap - Centralize config loading (env/flags) with validation at startup. - Fail fast on missing required configuration. - Separate config structs from business logic. - Support environment-specific overrides cleanly. ### Evolution and Maintainability - Plan how the structure scales as features grow. - Document conventions in a CONTRIBUTING or README for the team. - Add lint rules (depguard) to enforce boundaries. - Keep refactoring cheap by minimizing cross-package coupling. ## ASK THE USER FOR - The service domain and rough size (number of features/endpoints). - Transport(s) used (HTTP, gRPC) and main dependencies. - Team size and experience to calibrate structure complexity. - Whether this is greenfield or a refactor of existing code.
Or press ⌘C to copy