这个问题很常见:一个对象应该在发生某些事件时通知所有订阅者。在C ++中,我们可以使用boost::signals
或其他东西。但是如何用Go语言做到这一点?很高兴看到一些工作代码示例,其中有几个对象订阅了发布者并处理通知。
由于
答案 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)。他们将观察者与渠道进行比较。