2 つの goroutine を実行する無限ループを開始するには、以下のコードを使用できます。
メッセージを受信した後、新しい goroutine が開始され、永久に継続されます。
c1 := make(chan string)
c2 := make(chan string)
go DoStuff(c1, 5)
go DoStuff(c2, 2)
for ; true; {
select {
case msg1 := <-c1:
fmt.Println("received ", msg1)
go DoStuff(c1, 1)
case msg2 := <-c2:
fmt.Println("received ", msg2)
go DoStuff(c2, 9)
}
}
N 個の goroutine に対して同じ動作を実現したいのですが、その場合の select ステートメントはどのようになるでしょうか?
これは私が始めたコードの一部ですが、選択ステートメントをどのようにコーディングすればよいかわかりません
numChans := 2
//I keep the channels in this slice, and want to "loop" over them in the select statemnt
var chans = [] chan string{}
for i:=0;i<numChans;i++{
tmp := make(chan string);
chans = append(chans, tmp);
go DoStuff(tmp, i + 1)
//How shall the select statment be coded for this case?
for ; true; {
select {
case msg1 := <-c1:
fmt.Println("received ", msg1)
go DoStuff(c1, 1)
case msg2 := <-c2:
fmt.Println("received ", msg2)
go DoStuff(c2, 9)
}
}
ベストアンサー1
func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)
Select は、ケースのリストで記述された選択操作を実行します。Go の select ステートメントと同様に、少なくとも 1 つのケースが処理できるようになるまでブロックし、均一な疑似ランダム選択を行ってから、そのケースを実行します。選択されたケースのインデックスを返します。そのケースが受信操作だった場合は、受信した値と、その値がチャネルの送信に対応しているかどうかを示すブール値 (チャネルが閉じているために受信したゼロ値ではない) を返します。
SelectCase
選択するチャネル、操作の方向、および送信操作の場合に送信する値を識別する構造体の配列を渡します。
したがって、次のようなことができます。
cases := make([]reflect.SelectCase, len(chans))
for i, ch := range chans {
cases[i] = reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)}
}
chosen, value, ok := reflect.Select(cases)
// ok will be true if the channel has not been closed.
ch := chans[chosen]
msg := value.String()
ここで、より具体的な例を試すことができます:http://play.golang.org/p/8zwvSk4kjx