1

The Go Programming Language Specificationから引用するには:

「select」ステートメントは、一連の可能な通信のどれを続行するかを選択します。これは「switch」ステートメントに似ていますが、ケースはすべて通信操作を参照しています。

case両方のチャネルがケースを返したときにのみ実行されるように、句で複数のチャネルを待機するにはどうすればよいですか?

:

select {

   case <-ch1, <-ch2 ... : //wait for ch1 and ch2 
        // do something 
   case  ..
}
4

1 に答える 1

5

ドキュメントで説明されているように、同じ選択ケースで複数のチャネルを待つ方法はなく、選択ケースで「フォールスルー」する方法もありません。

ただし、このようなことは他の手段で簡単に行うことができます。

選択なし:

これは、c2 が利用可能であるにもかかわらず c1 が返されることが保証されている場合にのみ機能します。

v1 := <-c1
v2 := <-c2

ループあり:

これは順序に関係なく機能しますが、c1 と c2 は 1 回だけ起動する必要があります。そうしないと、誤動作する可能性があります。

var v1, v2 int
for i := 0; i < 2; i++ {
    select {
    case v1 = <-c1:
    case v2 = <-c2:
    }
}
// both v1 and v2 are set here

ゴルーチンの場合:

これはどちらの方法でも機能しますが、結果の順序が失われます。

c3 := make(chan int, 2)
go func() { c3 <- (<-c1) }()
go func() { c3 <- (<-c2) }()

first := <-c3
second := <-c3

sync.WaitGroup を使用:

これはどちらの方法でも機能します。

var wg sync.WaitGroup
var v1, v2 int
wg.Add(2)
go func() {
    v1 = <-c1
    wg.Done()
}()
go func() {
    v2 = <-c2
    wg.Done()
}()
wg.Wait()
// v1 and v2 are both set

等々。確かに他の方法もあります。最適なものは、達成しようとしているものの詳細によって異なります。

于 2013-09-07T17:32:18.290 に答える