Maison  >  Article  >  développement back-end  >  Comment implémenter le modèle Observer dans Go à l'aide de canaux ?

Comment implémenter le modèle Observer dans Go à l'aide de canaux ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-05 12:59:02263parcourir

How to Implement the Observer Pattern in Go Using Channels?

Modèle Observer en langage Go

En génie logiciel, le modèle Observer est utilisé lorsqu'il est nécessaire de notifier un ensemble d'abonnés lorsqu'un événement se produit dans un objet. Un cadre commun pour y parvenir en C est boost::signaux. Cette question explore comment reproduire cette fonctionnalité dans Go, à l'aide d'un exemple qui montre comment plusieurs abonnés peuvent s'inscrire auprès d'un éditeur et recevoir des notifications.

Solution

Le modèle Observer peut être facilement implémenté dans Go à l’aide de canaux. Leur objectif inhérent est de faciliter la communication entre les goroutines concurrentes.

type Publisher 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
}

Bien que cet exemple ne soit pas un exemple de code fonctionnel complet, il fournit une base solide pour implémenter le modèle Observer dans Go à l'aide de canaux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn