複数の異なる型の値を受け入れることができる Go チャネルを作成するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-04 03:08:02
オリジナル
792 人が閲覧しました

How can I create Go channels that can accept values of multiple different types?

Go のタイプに依存しないチャネル

Go のチャネルは、ゴルーチンがデータを送受信できるようにする強力な通信メカニズムです。ほとんどの場合、チャネルは特定のタイプの値を伝達するために使用されます。ただし、複数の異なるタイプを受け入れることができるチャネルを作成することは可能です。

次の例を考えてみましょう。

<code class="go">package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan interface{})
    go func() {
        for {
            select {
            case p := <-ch:
                fmt.Printf("Received a %q\n", reflect.TypeOf(p).Name())
            case <-time.After(time.Second):
                fmt.Println("Empty Loop")
                return
            }
        }
    }()
    ch <- "Hello"
    time.Sleep(time.Second)
    ch <- 123
    time.Sleep(time.Second)
    ch <- struct{}{}
    time.Sleep(time.Second)
    ch <- []string{"Go", "programming"}
    time.Sleep(time.Second)
}</code>
ログイン後にコピー

このコードは、任意のタイプを受け入れることができる chan インターフェース タイプのチャネルを作成します。{}値のタイプ。 goroutine はチャネル上の値を受け取ると、リフレクションを使用して値の型を決定し、それを出力します。

次に示すように、型スイッチを使用してチャネル上のさまざまな型の値を処理することもできます。以下:

<code class="go">package main

import (
    "fmt"
    "reflect"
    "time"
)

func main() {
    ch := make(chan interface{})
    go func() {
        for {
            select {
            case p := <-ch:
                switch p := p.(type) {
                case string:
                    fmt.Printf("Got a string %q\n", p)
                case int:
                    fmt.Printf("Got an int %d\n", p)
                case struct{}:
                    fmt.Println("Got an empty struct")
                case []string:
                    fmt.Printf("Got a slice of strings %+v\n", p)
                default:
                    fmt.Printf("Type of p is %T. Value %v\n", p, p)
                }
            case <-time.After(time.Second):
                fmt.Println("Empty Loop")
                return
            }
        }
    }()
    ch <- "Hello"
    time.Sleep(time.Second)
    ch <- 123
    time.Sleep(time.Second)
    ch <- struct{}{}
    time.Sleep(time.Second)
    ch <- []string{"Go", "programming"}
    time.Sleep(time.Second)
}</code>
ログイン後にコピー

この例は、タイプ スイッチを使用してチャネル上のさまざまなタイプの値を処理する方法を示します。

以上が複数の異なる型の値を受け入れることができる Go チャネルを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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