Проблема
Многие разработчики, переходя на Go, тащат с собой паттерны из Java или C#. В результате получается overengineered код. Go — это про простоту.
Моя интерпретация
project/
├── cmd/server/main.go
├── internal/
│ ├── handler/ // HTTP handlers
│ ├── service/ // Business logic
│ ├── repository/ // Data access
│ └── model/ // Domain models
├── pkg/ // Reusable packages
└── migrations/
Ключевые принципы
Dependency Injection через конструкторы — никаких DI-контейнеров.
Интерфейсы на стороне потребителя — определяйте интерфейс там, где он используется.
Минимум абстракций — если функция используется в одном месте, не нужен интерфейс.
type PostCreator interface {
Create(ctx context.Context, post *model.Post) error
}
type Handler struct {
posts PostCreator
}