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 サイトの他の関連記事を参照してください。