Go チャネルを使用してオブザーバー パターンを実装するにはどうすればよいですか?

DDD
リリース: 2024-11-05 11:01:02
オリジナル
987 人が閲覧しました

How can Go channels be used to implement the Observer Pattern?

Go 言語のオブザーバー パターン

多くのプログラミング シナリオでは、イベントの発生時にオブジェクトが複数のサブスクライバーに通知する必要があるというニーズが生じます。このパターンは通常、オブザーバー パターンとして知られています。 Go では、チャネルは、このパターンを実装するための洗練されたソリューションを提供します。

以下のコード サンプルは、実際の例を示しています。

<code class="go">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() {
    publisher := &Publisher{}

    subscribers := []*Subscriber{
        &Subscriber{make(chan *Msg)},
        &Subscriber{make(chan *Msg)},
        // Additional subscribers can be added here
    }

    for _, sub := range subscribers {
        publisher.Sub(sub.Channel)
        go sub.ListenOnChannel()
    }

    publisher.Pub(&Msg{"Event Notification"})

    // Pause the main function to allow subscribers to process messages
    time.Sleep(time.Second)
}

type Msg struct {
    Message string
}</code>
ログイン後にコピー

この例では、パブリッシャーはリスナー チャネルのスライスを保持します。これはサブスクライブされたオブジェクトを表します。 Pub メソッドは、データをチャネルに送信することですべてのリスナーに通知します。各サブスクライバは、処理する受信データを専用チャネルで継続的にリッスンします。

以上がGo チャネルを使用してオブザーバー パターンを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!