package core import ( "errors" "fmt" ) type Subscriber interface { Subscribe() (int16, <-chan string) Unsubscribe(id int16) error } type Publisher interface { Publish(message string) } type dispatcher struct { listeners map[int16]chan string counter int16 } func NewDispatcher() *dispatcher { fmt.Println("new dispatcher") return &dispatcher{ listeners: make(map[int16]chan string), counter: 0, } } func (d *dispatcher) Publish(message string) { //fmt.Println("publish to listeners", len(d.listeners)) for _, ch := range d.listeners { ch <- message } } func (d *dispatcher) Subscribe() (id int16, receiver <-chan string) { fmt.Println("subscribe") key := d.counter d.counter++ rec := make(chan string) d.listeners[key] = rec return key, rec } func (d *dispatcher) Unsubscribe(id int16) error { fmt.Println("unsubscribe") receiver, ok := d.listeners[id] if !ok { return errors.New("no subscription with id") } delete(d.listeners, id) close(receiver) return nil }