Оба подхода разделяют одну идею: бизнес-логика не зависит от инфраструктуры.
Слои: Entities -> Use Cases -> Interface Adapters -> Frameworks. Зависимости строго внутрь: use case определяет интерфейс репозитория, а не импортирует пакет PostgreSQL.
Ядро приложения окружено портами (интерфейсы) и адаптерами (реализации). Входящие порты: HTTP handler, gRPC, CLI. Исходящие порты: репозиторий, email-сервис. Адаптеры подключаются снаружи.
// Порт (интерфейс в домене)
type OrderRepository interface {
Save(ctx context.Context, o *Order) error
}
// Адаптер (реализация в инфраструктуре)
type PgOrderRepo struct { pool *pgxpool.Pool }
func (r *PgOrderRepo) Save(ctx context.Context, o *Order) error { ... }
В Go это реализуется через пакеты: domain (сущности + интерфейсы), usecase (бизнес-логика), adapters/http, adapters/postgres. Тестирование домена с моками, без реальной БД.