2010-09-17 17 views
14

Bu sorun oldukça yaygındır: Bir nesne, bazı olaylar olduğunda tüm abonelerini bilgilendirmelidir. C++ 'da boost::signals veya başka bir şey kullanabiliriz. Ama bunu Go dilinde nasıl yapmalı? Birkaç yayıncının bir yayıncıya ve işlem bildirimlerine abone olduğu bazı çalışma kodu örneklerini görmek güzel olurdu.Git dilindeki gözetmen deseni

Teşekkürler

cevap

14

Bu aslında Go'da oldukça basittir. Kanalları kullan. Bu onlar için yapılan şeylerin bir türüdür.

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 
} 

Açıkçası bu tam olarak çalışan bir kod örneği değil. Ama yakın.

+1

Kanal işlemlerini engellemeye dikkat edin. –

+0

@MizardX, elbette, normalde, kontrol kanalının da olduğu gibi, chan bool gibi kullanacağım ve {} seçeneğini seçip, kontrol kanalından bir recv'den çıkacağım. Ama hepsi çok basit ve temel bir örnek için biraz fazla. – cthom06

+1

@MizardX: C dilinde "işaretçi aritmetiğine dikkat et" demek gibi bir şey değil mi? Kanallara dikkat etmek, Git programlamanın% 90'ını ;-) –