package observer import ( "fmt" ) type Observer interface { Notify(string) } type Publisher struct { ObserverList []Observer } func (p *Publisher) Subscribe(o Observer) { p.ObserverList = append(p.ObserverList, o) } func (p *Publisher) Unsubscribe(o Observer) { var index int for i, v := range p.ObserverList { if v == o { index = i break } } p.ObserverList = append(p.ObserverList[:index], p.ObserverList[index + 1:]...) } func (p *Publisher) Publish(m string) { fmt.Println("Got new message! Publishing...") for _, o := range p.ObserverList { o.Notify(m) } fmt.Println("Puplished!") }