14
這個問題很常見:當某個事件發生時,對象應該通知其所有訂閱者。在C++中,我們可以使用boost::signals
或其他的東西。但是如何在Go語言中做到這一點?很高興看到一些工作代碼示例,其中有幾個對象訂閱了發佈者並處理通知。Go語言的觀察者模式
謝謝
這個問題很常見:當某個事件發生時,對象應該通知其所有訂閱者。在C++中,我們可以使用boost::signals
或其他的東西。但是如何在Go語言中做到這一點?很高興看到一些工作代碼示例,其中有幾個對象訂閱了發佈者並處理通知。Go語言的觀察者模式
謝謝
這在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
}
很明顯,這不是一個正確的代碼示例。但它很接近。
請注意阻止頻道操作。 – 2010-09-17 12:23:57
@MizardX當然,通常我會有控制陳,以及chan bool,並使用select {},並退出控制通道的recv。但是這對於一個基本的例子來說都相當平凡而且有點過分。 – cthom06 2010-09-17 12:32:30
@MizardX:是不是有點像在C中說「小心指針算術」?小心使用頻道是Go編程的90%;-) – 2010-09-17 12:37:33