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を呼んだ時点でちゃんとタイムアウトされる、ということでした。ちゃんちゃん。


Goで(メールサーバを用意せずに)メールを送る
Previous article

Goで(メールサーバを用意せずに)メールを送る

単純な興味というか、特にこれで何かを作るというわけではないのだけれど、ふと思い立って調べてみたら意外と情報が無かったのでメモを残しておきます。 Goでメールを送りたい、と思ったとき、Googleで検索してみると、net/smtpパッケージを使ってgmailのSMTPサーバを使用する、とかSendGridを使用する、とかそういった例ばかりが目につきました。これらはもちろん便利であることは疑いようもない(自前でメールサーバの管理とかやってられないし)んですけど、こういったSMTPサーバやらsendmail/postfixやらを使わなくても、本来SMTPではメールを簡単に送れるはず(なんと言っても「Simple Mail Transfer Protocol」ですから)、と思いました。 とはいえじゃぁどうしたら良いのか、と思ったとき、

誕生日パエリア
Next article

誕生日パエリア

先日、無事誕生日なるものを今年も迎えることができたのですが、twitterやらfacebookやらに欲しいものリストを貼った結果、皆様いろいろと贈ってくださり、本当にありがとうございます。 ところで、欲しいものリストにパエリアパンなど入れていなかったのですが、なぜか届きました。 家広そうだし入って無くても送ってみっかと思ってポチってみた😇 — TᗩKᑌᗰI KOᗷᗩYᗩᔕᕼI (@chamaharun) April 8, 2020 全く以て意味がわからないですね。しかし贈ってくれたのに使わない、というのもなんなので、パエリアを作ることにしました。 なお誕生日パエリアというタイトルですが、今日誕生日、というわけではありません。 材料はこちら。アサリ小パック、


GO TOP

🎉 You've successfully subscribed to something tech.!
OK