Ответ
В Go типичная многослойная архитектура включает:
- Transport (HTTP/gRPC) - обработка запросов/ответов
// HTTP handler
func (h *Handler) GetUser(c *gin.Context) {
id := c.Param("id")
user, err := h.service.GetUser(id)
// ... обработка ошибок и отправка ответа
}
- Service/Business logic - ядро приложения, содержит бизнес-правила и координирует работу с репозиториями.
type UserService struct {
repo Repository
}
func (s *UserService) GetUser(id string) (*User, error) {
// Дополнительная бизнес-логика, валидация и т.д.
return s.repo.GetByID(id)
}
- Repository - абстракция для работы с данными (базы данных, внешние API, файловая система).
type UserRepository struct {
db *sql.DB
}
func (r *UserRepository) GetByID(id string) (*User, error) {
// Выполнение запроса к БД и маппинг в модель
row := r.db.QueryRow("SELECT id, name, email FROM users WHERE id = ?", id)
user := &User{}
err := row.Scan(&user.ID, &user.Name, &user.Email)
if err != nil {
return nil, err
}
return user, nil
}
- Models/Entities - структуры данных, представляющие сущности предметной области.
type User struct {
ID string
Name string
Email string
}
Дополнительно могут быть:
- Middleware: для обработки запросов до или после основных обработчиков (аутентификация, логирование).
- DTO (Data Transfer Objects): структуры для передачи данных между слоями, часто отличаются от моделей.
- Utils/Helpers: общие вспомогательные функции.
Ключевые принципы: слои изолированы, зависимости идут сверху вниз (Transport -> Service -> Repository -> Models). Каждый слой имеет свою ответственность, что упрощает тестирование и поддержку.