LoginSignup
8
2

More than 5 years have passed since last update.

golangの時刻処理におけるint型の取り扱い方

Last updated at Posted at 2019-03-10

はじめに

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を身につけたい方、システムプログラミングを知りたい方、是非手にとってみてはどうでしょうか?とてもおすすめです!

さて、こちらの記事が私の初めて書いた記事となります。
これからは自分が学習中に気づいたこと、そしてみなさんを共有したいことを書いていこうと思います!
それではまた近いうちにお会いしましょう!

参考

time-The Go Programming Language

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2