> Как реализовать расширяемость процессора для добавления новых типов событий без изменения кода (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" }// Инициализация в mainproc := NewProcessor()proc.RegisterHandler("user.created", func(e Event) error {ue := e.(UserCreated)fmt.Printf("User %d created\n", ue.UserID)return nil})
Преимущества:
- Новые типы событий добавляются через регистрацию, без модификации
Processor. - Go-интерфейсы обеспечивают слабую связанность.
- Можно легко добавить валидацию, логирование или цепочки обработчиков.
Для более сложных сценариев (например, асинхронная обработка) можно использовать каналы и горутины, но базовый принцип регистрации остаётся тем же.
> Похожие задачи по Go
В каком порядке и синхронно или асинхронно выполнять запись данных
Есть ли параметры у мапы в Go, например возможность заранее задать размер
Как скопировать все значения большой мапы в Go
Какую проблему решает Kubernetes
> Похожие задачи по backend
В каком порядке и синхронно или асинхронно выполнять запись данных
Есть ли параметры у мапы в Go, например возможность заранее задать размер
Как скопировать все значения большой мапы в Go
Какую проблему решает Kubernetes
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью