17

select ステートメントにデフォルトの原因があり、何もしたくないので続行しますが、行を空白のままにしておくと、ステートメント内で何も起こらなくなります

        select {
        case quit_status := <-quit:
            if quit_status == true {
                fmt.Printf("********************* GOROUTINE [%d] Received QUIT MSG\n", id)
                return
            }
        default:
            fmt.Printf("GOROUTINE [%d] step: %d, NO QUIT MSG\n", id, i)
        }
4

2 に答える 2

10

ステートメントのdefaultケースは、selectチャネルの読み取りと書き込みにノンブロッキング I/O を提供することを目的としています。ケース内のコードは、defaultどのケースのどのチャネルも読み取り/書き込みの準備ができていない場合に実行されます。

したがって、あなたの場合、default終了チャネルに何も言うことがない場合、ブロックが実行されます。デフォルトのケースを削除するだけでquit_status := <-quit、値がquit.. で利用可能になるまでケースでブロックされます。これはおそらく、このインスタンスで求めているものです。

select ステートメントの後ですぐにコードの実行を継続したい場合は、別の goroutine でこの select ステートメントを実行する必要があります。

go func() {
    select {
    case quit_status := <-quit:
        ...

    }
}()

// Execution continues here immediately.
于 2012-09-17T02:00:28.410 に答える