Go wrapper: データ型のインタフェースを追加する
Closed this issue · 4 comments
s-yata commented
概要
データを受け取るときに interface{}
を使うとビルド時に型チェックが働かなくなります.
そこで, Grnxx の各種データ型に対応する型に共通のインタフェースを追加し,そのインタフェースを使って受け取るようにします.
そのため, int64
や float64
をそのまま扱うのではなく,以下のようにして新たな型を用意します.
type Int int64
type Float float64
それから,インタフェースを定義して IsNA()
などのメソッドを用意します.
s-yata commented
Text
Text を忘れていました.
以下のようにします.
type Text []byte
s-yata commented
インタフェース
インタフェースは以下のようにします.
type Valuer interface {
IsNA() bool
}
各データ型のメソッドは以下のようにします.
func (this Bool) IsNA() bool {
return this == 1
}
func (this Int) IsNA() bool {
return this == math.MinInt64
}
func (this Float) IsNA() bool {
return math.IsNaN(float64(this))
}
func (this GeoPoint) IsNA() bool {
return this.Latitude == math.MinInt32
}
func (this Text) IsNA() bool {
return this == nil
}
s-yata commented
インタフェースの使用
以下の関数以外は問題なく interface{}
から Valuer
へと移行できました.
func (column *Column) Get(rowID Int, value interface{}) error {
// ...
}
func (this *Expression) Evaluate(records []Record, values interface{}) error {
// ...
}
s-yata commented
例外
上述の Get()
と Evaluate()
については,呼び出し側で用意した変数を渡して書き込んでもらうという使い方であり,誤って別の型を渡してしまうというケースは少ないと思います.
そういうわけで,これらについては保留しようと思います.
ちなみに, *Valuer
や []Valuer
では意味が変わってしまうので駄目です.
- InterfaceSlice - go-wiki - Explanation of why you can't go from
[]Type
directly to[]interface{}
, and what you can do instead. - Go Language Community Wiki - Google Project Hosting