迷ったら一旦、Effective Goメモかuber-style-guideを見よう!
Channel Size is One or None
channelのサイズは普段は1もしくはバッファなしのものにするべき- デフォルトでは
channelはバッファなしでサイズが0になっていて、 それより大きいサイズにする場合はよく考える必要がある - どのようにしてサイズを決定するのか、チャネルがいっぱいになり処理がブロックされたときにどのような挙動をするかよく考える必要がある
- デフォルトでは
Use “time” to handle time
- 時間を正く扱うのは非常に難しい!!ので、時間を扱う場合は常に
timeパッケージを使用する
Use time.Time for instants of time - 時刻を扱う(比較や足し引き)時は
time.Time型のメソッドを使用する
func isActive(now, start, stop time.Time) bool {
return (start.Before(now) || start.Equal(now)) && now.Before(stop)
}Use time.Duration for periods of time
- 期間を扱う時には
time.Duration型を使用する
func poll(delay time.Duration) {
for {
// ...
time.Sleep(delay)
}
}
poll(10*time.Second)- カレンダー上で次の日の同じ時刻にしたい場合は
time.AddDateメソッドを使用する。もしその時刻から正確にxx時間後にしたい場合はtime.Addメソッドを使う
newDay := t.AddDate(0 /* years */, 0, /* months */, 1 /* days */)
maybeNewDay := t.Add(24 * time.Hour)Style
Avoid overly long lines
- 横にスクロールしたり、たくさん首をふるような長過ぎるコードは避ける
- 横幅は99文字を推奨している。書く側はこれを超えると改行したほうが良いが、絶対ではない
Unnecessary Else
if-elseのどちらでも変数に代入する場合、条件に一致した場合に上書きするようにする
a := 10
if b {
a = 100
}