Golang Playgroundってtime.Now()
が"2009-11-10 23:00:00"を固定で返すけど、time.Sleep()
やtime.Timer
とかも、細工されてるのかぁ。
クライアントはこのレスポンスを受け取って、 Delay が指定されている場合は、メッセージを遅延して表示するようになっていて、あたかもスリープしているかのような挙動がみえるようになっています。
このように、 faketime を利用することで、バックエンドサーバーでは実際にスリープさせることなく即座にレスポンスを返しながらも、ユーザーに対してはスリープしているかのようにみせています。
Go Playground の仕組みを調べてみた - AI時代のスキル面接ならHireRoo https://hireroo.io/journal/tech/go-playground-internal
これを解決する為、Go Playgroundサーバーは実際に指定された時間Sleepするのではなく、内部に保持する擬似的な経過時間を進めつつ即座に次にSleepから起きるGoroutineを見つけて実行する、というトリックを使っています。
つまりtime.Sleepやtime.Timer、time.Tickerなどによる待機は無視されて処理がすぐに完了します。
実際にGo Playgroundからtime.Sleepを含んだコードを実行するとちゃんと指定した通りのSleepが実行されている様に見えますが、ここにもトリックがあります。
Go Playgroundサーバーは標準出力や標準エラーへの出力があるとその時点の擬似経過時間を含む "playback header" を付与して出力します。サーバー側で全ての処理が完了してから、フロントでレスポンスのplayback headerを解析して追再生しているのです。
【Go言語】Fake timeつかったら時間のかかるコードのテストが一瞬で終わった #Go - Qiita https://qiita.com/hogedigo/items/c2b6281961c5e21c4907