Go语言中的观察者模式

Sta*_*tas 15 go observer-pattern

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

谢谢

cth*_*m06 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
}
Run Code Online (Sandbox Code Playgroud)

显然,这不是一个正常工作的代码示例.但它很接近.

  • 这在技术上是向所有订阅者发送指向同一消息的指针,这在内存上更容易但有潜在危险(可变事件).如果频道不是*Msg类型,而是"chan Msg",那么我是否会在周围发送相同消息的副本?假设小消息,这似乎是一个更安全的解决方案. (6认同)
  • 小心阻塞通道操作。 (2认同)
  • 什么是“Publisher”以及如何同步对其的访问?实施起来并不简单,我确信这才是*真正的*问题。 (2认同)