package patterns type Observer interface { Update() } type Subject interface { Register(o Observer) Unregister(o Observer) Notify() } type subject struct { observers map[Observer]bool } func NewSubject() Subject { return &subject{ observers: make(map[Observer]bool), } } func (s *subject) Register(o Observer) { s.observers[o] = true } func (s *subject) Unregister(o Observer) { delete(s.observers, o) } func (s *subject) Notify() { for o := range s.observers { o.Update() } }