Назад к вопросам
Senior
3
Расскажи кейс использования интерфейсов в production-логике с точки зрения архитектуры
Компании, где спрашивали
СБК ПАРУС
Ответ от нейросети
sobes.tech AI
В production-логике на Go интерфейсы часто используются для достижения слабой связанности компонентов и удобства тестирования.
Например, в архитектуре приложения можно определить интерфейс для слоя доступа к данным:
// UserRepository описывает методы для работы с пользователями
type UserRepository interface {
GetUserByID(id int) (*User, error)
SaveUser(user *User) error
}
В бизнес-логике (сервисном слое) мы принимаем этот интерфейс, не завися от конкретной реализации (например, базы данных или mock для тестов):
func NewUserService(repo UserRepository) *UserService {
return &UserService{repo: repo}
}
func (s *UserService) GetUserProfile(id int) (*UserProfile, error) {
user, err := s.repo.GetUserByID(id)
if err != nil {
return nil, err
}
// дополнительная логика
return &UserProfile{User: user}, nil
}
Такой подход позволяет:
- Легко менять реализацию репозитория (например, переключаться между базами данных или использовать mock для тестов).
- Изолировать бизнес-логику от деталей хранения данных.
- Улучшить читаемость и поддержку кода.
В production это помогает создавать гибкие и масштабируемые приложения с четким разделением ответственности.