2010-09-17 74 views
14

這個問題很常見:​​當某個事件發生時,對象應該通知其所有訂閱者。在C++中,我們可以使用boost::signals或其他的東西。但是如何在Go語言中做到這一點?很高興看到一些工作代碼示例,其中有幾個對象訂閱了發佈者並處理通知。Go語言的觀察者模式

謝謝

回答

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

請注意阻止頻道操作。 – 2010-09-17 12:23:57

+0

@MizardX當然,通常我會有控制陳,以及chan bool,並使用select {},並退出控制通道的recv。但是這對於一個基本的例子來說都相當平凡而且有點過分。 – cthom06 2010-09-17 12:32:30

+1

@MizardX:是不是有點像在C中說「小心指針算術」?小心使用頻道是Go編程的90%;-) – 2010-09-17 12:37:33