Golang書くときのちょっとしたテクニック
MarshalJSONを使ってJSONに表示用のフィールドを追加する
無限ループしないように元の構造体を拡張する
// UTCな時間をJsonに変換するタイミングでJSTに変換する例 import "time" type Hoge struct { ID uint CreatedAt time.Time } func (h Hoge) MarshalJSON() ([]byte, error) { type Alias Hoge return json.Marshal(&struct { Alias CreatedAtJST time.Time }{ Alias: (Alias)(h), CreatedAtJST: h.CreatedAt.In(time.LoadLocation("Asia/Tokyo")), } }
参考
Enum
数値系Enum
ゼロ値をUnknownにするのがGolang流
type DeviceType uint const ( Unknown DeviceType = iota Android IOS )
文字列系Enum
type Status string const ( Success Status = "success" Failure Status = "failure" )
関数にオプショナルな引数を設定したいとき
FunctionalOptionPatternを使って実装する
https://blog.web-apps.tech/go-functional-option-pattern/
リクエストボディの読み出しが1回しかできないときの対処方法
リクエストボディを ioutil.ReadAll 関数で読み出すと2回目以降は中身空っぽになります。それの回避方法です。
http - How to read response body twice in Golang middleware? - Stack Overflow
Gotestでいい感じのスタブを作る方法
gomockインストールするのはちょっとなぁって時に良いです。