package util type Event struct { eventName string payload interface {} } func NewEvent(eventName string, payload interface{}) *Event{ return &Event{ eventName, payload, } } func (e *Event) EventName() string { return e.eventName } func (e *Event) Payload() interface{} { return e.payload } type EventHandler func(payload interface{}) type EventBus struct { handlers map[string][]EventHandler } func NewEventBus() *EventBus{ return &EventBus{ make(map[string][]EventHandler) } } func (eb *EventBus) Register(eventName string, handler EventHandler) { eb.handlers[eventName] = append(eb.handlers[eventName], handler) } func (eb *EventBus) Handle(e Event){ for _, handler := range eb.handlers[e.EventName()] { handler(e.Payload()) } }