2016-08-25 15 views
1

select caseステートメントでチャネルペアの割り当てを行う方法はありますか?selectステートメントでのゴランチャネルペアの割り当て

selectステートメントの外では、次のようなことができますが、select caseステートメントでは機能しないようです。

var c1 = make(chan int) 
var c2 = make(chan int) 

go func() { 
    c1 <- 11111 
}() 

go func() { 
    c2 <- 22222 
}() 

select { 
case a,b := <- c1, <- c2: 
    fmt.Println(a,b) 
} 

は何かが私が間違っているのがあるか、これは新しいアグリゲータチャネルを形成することなく、単に不可能です。

var c1 = make(chan int) 
var c2 = make(chan int) 
a,b := <- c1, <- c2 

なぜ私は次の操作を行うことができませんか?

最後の目標は、両方のチャネルが準備されるのを簡単に待つことです。

+0

いいえ、2つのチャンネルを同時に選択することはできません:https://golang.org/ref/spec#Select_statements – JimB

+0

どういう意味でしょう、そのタイプのセマンティクスはどういう意味ですか? _both_チャンネルが受信の準備ができている場合にのみ有効ですか?それがあなたのために起こっている(またはあなたがファンインが必要な)場合、設計上の問題のように思えます。 – Kaedys

+0

クイック回答ありがとうございます。 うん。私は一種のファンインレイアウトに行くつもりだった。私は、2つのチャンネルを同時に選択することはできないと結論づけています。 –

答えて

0

これはまったく不可能です。

あなたは準備ができて、両方のチャネルを待つ必要がある場合は、あなたが使用することができます:

select { 
case a, ok1 := <-c1: 
    b, ok2 := <-c2 
    if ok1 && ok2 { 
     fmt.Println("C1 and C2 both Ready:", a, b) 
    } 
} 
:いくつかのユースケースで

a := <-c1 
b := <-c2 

The Go Playground


、あなたはこれを使用することができます

The Go Playground

関連する問題