context.WithTimeoutに0を与えるとどうなるのか

· 1 min read
context.WithTimeoutに0を与えるとどうなるのか

当然と言えば当然なんですけど、特に panic とかそういうことはなく、一瞬でタイムアウトします。まぁ、どうと言うことは無いですが、設定ファイルとかで未定義時に0が来るような実装になっている場合はなんか処理する(0の時は処理をしない、というのは多分あんまりなさそうですし)必要がありますね。

ctx, cancel := context.WithTimeout(context.Background(), time.Duration(0))
defer cancel()

<-ctx.Done()
log.Print("timeout")

https://play.golang.org/p/63DkfIEImjv

もうちょっと細かい話

さすがに短すぎるので、もう少し細かい実装の話。

context.WithTimeoutは内部的には特別な実装は無くて、context.WithDeadlinetime.Now.Add(timeout)に対して呼んでいます。

で、context.WithDeadlineは返値を返す前にtime.Untilを使って現在時刻とデッドラインまでの差分をチェックしていて、これが0以下ならその場でキャンセル関数を呼んでいます。

まぁそんなわけで、余分な待ち時間が発生することもなく、time.WithTimeoutを呼んだ時点でちゃんとタイムアウトされる、ということでした。ちゃんちゃん。