はじめに
golangで簡単なタイマーをつくろうとしたときに出会いました。
timeパッケージはint型を使用するのにひと工夫が必要です。
time.Duration型
以下のようなソースを書いたところ
package main
import (
"flag"
"fmt"
"strconv"
"time"
)
func main() {
fmt.Printf("timer start %v\n", time.Now())
// 第一引数の値をintegerに変換する
flag.Parse()
second, err := strconv.Atoi(flag.Arg(0))
if err != nil {
fmt.Println(err)
}
// データは読み捨てる
<-time.After(second * time.Second)
fmt.Printf("timer stop %v\n", time.Now())
}
こんなエラーが出ました。
invalid operation: second * time.Second (mismatched types int and time.Duration)
time.After()ではtime.Duration型を受け付けますが, int型*Duration型は使えないみたいです。
そのため, 時刻処理にint型を使用する際にはtime.Duration()でラップしてやる必要があります。
<-time.After(time.Duration(second) * time.Second)
エラーも出なくなりましたので動かしてみましょうか。
go run timer.go 5
timer start 2019-03-10 23:26:00.38674904 +0900 JST m=+0.000227757
timer stop 2019-03-10 23:26:05.386941458 +0900 JST m=+5.000420240
ばっちり動いてますね!
さいごに
そもそもなぜタイマーをつくっていたのかというと渋川よしきさん著の「Goならわかるシステムプログラミング」という本を読んでいたためでした。
こちらの本、とてもわくわくしながら読み進められています!
golangを身につけたい方、システムプログラミングを知りたい方、是非手にとってみてはどうでしょうか?とてもおすすめです!
さて、こちらの記事が私の初めて書いた記事となります。
これからは自分が学習中に気づいたこと、そしてみなさんを共有したいことを書いていこうと思います!
それではまた近いうちにお会いしましょう!