9

これまでに見たすべての例では、(<-chan演算子を介して) 結果を取得するためのブロックが含まれています。

私の現在のアプローチには、ポインタを構造体に渡すことが含まれます。

type goresult struct {
    result resultType;
    finished bool;
}

完了時にゴルーチンが書き込みます。次に、都合の良いときにいつでもチェックするのは簡単なことですfinished。より良い代替手段はありますか?

私が本当に目指しているのは、Qt スタイルのシグナルスロット システムです。私は解決策がほとんど些細なことに見えると思っています ( chans には未踏の可能性がたくさんあります) が、私はまだそれを理解するのに十分な言語に精通していません.

4

3 に答える 3

13

「コンマ、OK」パターンを使用できます(「効果的な実行」のページを参照)。

foo     := <- ch; // This blocks.
foo, ok := <- ch; // This returns immediately.
于 2009-11-13T19:49:36.827 に答える
5

Select ステートメントを使用すると、(通信が待機しているチャネルの) ランダムな分岐を使用して、複数のチャネルを一度にチェックできます。

func main () {
    for {
    select {
        case w := <- workchan:
            go do_work(w)
        case <- signalchan:
            return
        // default works here if no communication is available
        default:
            // do idle work
    }
    }
}

「select」ステートメント内のすべての send 式と receive 式について、チャネル式が評価され、send 式の右側にあるすべての式が上から順に評価されます。結果の操作のいずれかを続行できる場合は、1 つが選択され、対応する通信とステートメントが評価されます。それ以外の場合、デフォルトのケースがあればそれが実行されます。そうでない場合、ステートメントは通信の 1 つが完了するまでブロックします。

于 2009-11-13T18:20:00.727 に答える
5

len を使用して、チャネル バッファーを覗いて、何か含まれているかどうかを確認することもできます。

if len(channel) > 0 {
  // has data to receive
}

foo, gotValue := <- chのときに値を削除するのとは異なり、これはチャネル バッファに触れませんgotValue == true

于 2009-11-14T13:23:23.920 に答える