golang

gomockのMatcherで構造体を再帰的に比較する

gomockの引数のMatcherでgomock.Eq()を使うときに、構造体がポインタ型だったりするとうまく比較できない。 type Hoge struct { ID string } m.EXPECT().Hoge(gomock.Eq(&Hoge{ID: "1"})).Return(nil).AnyTimes() // マッチしない m.Hoge(&Hoge{ID: "1"}) そ…

go-cmp の cmp.Diff() でJSON文字列を比較できるようにする

go-cmp を使うと2つの構造体のDiffを取ることができるが、プロパティにJSON文字列([]byte や json.RawMessage など)があると、内容は同じでもインデント等が異なるとdiffが出てしまい、うまく比較できない。 type Hoge struct { ID string JSON json.RawMess…

github.com/go-sql-driver/mysql で date型のカラムをtime.Time型で扱うと日付がズレるのを回避する

以下の記事で示したように、github.com/go-sql-driver/mysql で parseTime、loc オプションを適切に設定することで、Go の time.Time型とMySQLの datetime 型をタイムゾーンを考慮して適切に相互変換できる。 mrk21.hatenablog.com しかし、同様にMySQLのdat…

github.com/go-sql-driver/mysql で datetime型のカラムのタイムゾーンを適切に扱う

MySQLのdatetime型はタイムゾーンを保持しないため、MySQL側でJSTで取り扱うと決めたら、クライアント側で都度適切にタイムゾーンを変換する必要がある。 Go言語でこれを適切に行うためには、DB接続時に github.com/go-sql-driver/mysql のDSNで以下のように…

PROXY protocol を使ってNLB配下のサーバーでクライアントの Remote IP を得る

背景 goproxy を使って HTTP Proxy server を作った その Proxy server は AWS Fargate で動作していてNLBでロードバランシングされている NLBはターゲットタイプがインスタンス以外だとRemote IPがNLBのものになってしまう Proxy server でクライアントのRe…