> Как реализовать расширяемость процессора для добавления новых типов событий без изменения кода (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Для реализации расширяемости процессора без изменения кода в Go можно использовать паттерн Visitor в сочетании с интерфейсами и регистрацией обработчиков. Основная идея - определить интерфейс события и позволить внешним пакетам регистрировать свои обработчики через карту (map) или слайс.

Пример реализации:

GO
// event.go - базовый интерфейс события
type Event interface {
Type() string
}
// processor.go - процессор с поддержкой расширений
type Processor struct {
handlers map[string]func(Event) error
}
func NewProcessor() *Processor {
return &Processor{handlers: make(map[string]func(Event) error)}
}
func (p *Processor) RegisterHandler(eventType string, handler func(Event) error) {
p.handlers[eventType] = handler
}
func (p *Processor) Process(event Event) error {
handler, ok := p.handlers[event.Type()]
if !ok {
return fmt.Errorf("no handler for event type: %s", event.Type())
}
return handler(event)
}

Внешний код может добавлять новые типы событий без изменения процессора:

GO
// user_events.go - новый пакет с типом события
type UserCreated struct {
UserID int
}
func (u UserCreated) Type() string { return "user.created" }
// Инициализация в main
proc := NewProcessor()
proc.RegisterHandler("user.created", func(e Event) error {
ue := e.(UserCreated)
fmt.Printf("User %d created\n", ue.UserID)
return nil
})

Преимущества:

  • Новые типы событий добавляются через регистрацию, без модификации Processor.
  • Go-интерфейсы обеспечивают слабую связанность.
  • Можно легко добавить валидацию, логирование или цепочки обработчиков.

Для более сложных сценариев (например, асинхронная обработка) можно использовать каналы и горутины, но базовый принцип регистрации остаётся тем же.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью