Observer — паттерн, при котором объект уведомляет подписчиков об изменениях. В Go реализуется через каналы или колбеки.
type EventBus struct {
mu sync.RWMutex
subscribers map[string][]chan Event
}
func (eb *EventBus) Subscribe(topic string) <-chan Event {
ch := make(chan Event, 10)
eb.mu.Lock()
eb.subscribers[topic] = append(eb.subscribers[topic], ch)
eb.mu.Unlock()
return ch
}
func (eb *EventBus) Publish(topic string, event Event) {
eb.mu.RLock()
for _, ch := range eb.subscribers[topic] {
ch <- event
}
eb.mu.RUnlock()
}
Каналы — идеальный примитив для Observer в Go: подписчик читает из канала в своей горутине, publisher пишет. Используется в event-driven архитектурах, WebSocket-серверах, системах нотификаций.