Шаблон наблюдателя на языке Go - PullRequest
14 голосов
/ 17 сентября 2010

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

Спасибо

Ответы [ 2 ]

14 голосов
/ 17 сентября 2010

Это на самом деле довольно просто в 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
}

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

0 голосов
/ 12 февраля 2019

Есть также go-наблюдатель (https://github.com/imkira/go-observer). Они сравнивают наблюдателя с каналами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...