GoTourからこの例を見てみましょう。これは、イベントがある場合にのみSDLイベントを処理する際の私の問題を示しています。
package main
import (
"fmt"
"time"
)
func main() {
tick := time.Tick(1e8)
boom := time.After(5e8)
for {
select {
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("BOOM!")
return
default:
fmt.Println(" .")
time.Sleep(5e7)
}
}
}
これは機能します。しかし、デフォルトの場合に印刷したりスリープしたりしたくないが、ループを続けたい場合はどうなりますか?私はこれを試しました:
case <-boom:
fmt.Println("BOOM!")
return
default: // Nothing here.
}
}
}
しかし、それはブロックします。
私はあちこちでゴルーチンのスケジューリングについての文章を見てきましたが、私はそれらを理解していませんでした。だから私は2つの質問があると思います:
1)なぜブロックするのですか?
2)ブロックせずに何もしないようにするにはどうすればよいですか?