経緯
データベースライブラリにgorpを使ってみている。
gorpでは(gorpというより、database/sqlの範疇かも)Goのint型はDBのintと、GoのstringはDBのtextやvarcharと、みたいに自動的にマッピングされて意識しなくてもデータやり取りができる。
Goには標準でdecimal型がなかったので外部ライブラリを使うことにした。
decimal - GoDoc
これをそのまま使った場合は、DBのdecimal型と勝手にマッピングしてくれた。
type Human struct { Id uint64 Money decimal.Decimal }
外部ライブラリを裸でそのまま使うのが嫌だったので、内部でラップして使うようににしたら勝手にはマッピングしてくれなくなった。
type Human struct { Id uint64 Money MyDecimal }
どうすればマッピングしてくれるか?
DBとのやり取りに使うには、database/sqlパッケージの「Scannerインターフェース」とdatabase/sql/driverパッケージの「Valuerインターフェース」が実装されている必要があるようだった。
decimalライブラリにはそれが定義されていたので、それをそのまま実行してやるようにすればOKだった。
type MyDecimal struct { decimal decimal.Decimal } func (d MyDecimal) Value() (driver.Value, error) { return d.decimal.Value() } func (d *MyDecimal) Scan(value interface{}) error { return d.decimal.Scan(value) } ...