Шаблон наблюдателя в языке Go

Эта проблема довольно распространена: объект должен уведомлять всех своих подписчиков о возникновении какого-либо события. В С++ мы можем использовать boost::signals или что-то еще. Но как это сделать на языке Go? Было бы неплохо увидеть пример рабочего кода, в котором несколько объектов подписываются на издателя и обрабатывают уведомления.

Спасибо

Ответы

Ответ 1

Это действительно довольно просто в Go. Используйте каналы. Это то, для чего они созданы.

type Publish struct {
    listeners []chan *Msg
}

type Subscriber struct {
    Channel chan *Msg
}

func (p *Publisher) Sub(c chan *Msg) {
    p.appendListener(c)
}

func (p *Publisher) Pub(m *Msg) {
    for _, c := range p.listeners {
        c <- Msg
    }
}

func (s *Subscriber) ListenOnChannel() {
    for {
        data := <-s.Channel
        //Process data
    }
}

func main() {
    for _, v := range subscribers {
        p.Sub(v.Channel)
        go v.ListenOnChannel()
    }
    //Some kind of wait here
}

Очевидно, что это не совсем пример рабочего кода. Но это близко.