やる気がストロングZERO

やる気のストロングスタイル

【Go】gorpにdecimal型を認識させる

経緯

データベースライブラリに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)
}

...