Классическое разделение на горизонтальные слои: presentation (HTTP handlers), business logic (service), data access (repository). Зависимости сверху вниз: handler вызывает service, service вызывает repository. Нижний слой не знает о верхнем. В Go: пакет handler (разбор HTTP, формирование ответов), пакет service (бизнес-правила, валидация, оркестрация), пакет repository (SQL-запросы, работа с БД). Проста в понимании и подходит для большинства CRUD-приложений. Отличие от Clean/Hexagonal: в layered зависимости идут в одну сторону (вниз), но слои могут зависеть от конкретных типов, а не от интерфейсов.
// handler -> service -> repository
type UserHandler struct { svc *UserService }
type UserService struct { repo *UserRepo }
type UserRepo struct { db *pgxpool.Pool }