2010-09-17 11 views
14

Este problema es bastante común: un objeto debe notificar a todos sus suscriptores cuando se produce algún evento. En C++ podemos usar boost::signals o algo más. Pero, ¿cómo hacer esto en Go language? Sería bueno ver un ejemplo de código de trabajo donde un par de objetos están suscritos a un editor y procesar notificaciones.Patrón de observador en lenguaje Go

Gracias

Respuesta

14

Esto es bastante simple en Go. Usa canales Este es el tipo de cosa para la que están hechos.

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 
} 

Obviamente esto no es exactamente una muestra de código de trabajo. Pero está cerca.

+1

Tenga cuidado al bloquear las operaciones del canal. –

+0

@MizardX, por supuesto, normalmente también tendría control de chan, como chan bool y uso select {}, y salgo de un canal de control desde el canal de control. Pero eso es bastante trivial y un poco excesivo para un ejemplo básico. – cthom06

+1

@MizardX: ¿no es como decir "tener cuidado con la aritmética del puntero" en C? Tener cuidado con los canales es el 90% de la programación de Go ;-) –

Cuestiones relacionadas