Go语言中的观察者模式

时间:2010-09-17 08:29:48

标签: go observer-pattern

这个问题很常见:​​一个对象应该在发生某些事件时通知所有订阅者。在C ++中,我们可以使用boost::signals或其他东西。但是如何用Go语言做到这一点?很高兴看到一些工作代码示例,其中有几个对象订阅了发布者并处理通知。

由于

2 个答案:

答案 0 :(得分:14)

这在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
}

显然,这不是一个有效的代码示例。但它很接近。

答案 1 :(得分:0)

还有观察者(https://github.com/imkira/go-observer)。他们将观察者与渠道进行比较。