package gnet import ( "errors" "fmt" ) 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 }