2010-09-17 4 views
14

Эта проблема довольно распространена: объект должен уведомлять всех своих подписчиков о возникновении какого-либо события. В C++ мы можем использовать boost::signals или что-то еще. Но как это сделать на языке Go? Было бы неплохо увидеть пример рабочего кода, в котором несколько объектов подписываются на издателя и обрабатывают уведомления.Шаблон наблюдателя в языке Go

Thanks

ответ

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

@MizardX, конечно, я бы тоже имел чан-чан, например chan bool, и использовал select {} и выходил из recv из канала управления. Но все это довольно тривиально и немного чрезмерно для базового примера. – cthom06

+1

@MizardX: разве это не похоже на высказывание «будьте осторожны с арифметикой указателя» в C? Будьте осторожны с каналами - это 90% программирования Go ;-) –

Смежные вопросы