groonga/grnxx

Go wrapper: データ型のインタフェースを追加する

Closed this issue · 4 comments

概要

データを受け取るときに interface{} を使うとビルド時に型チェックが働かなくなります.
そこで, Grnxx の各種データ型に対応する型に共通のインタフェースを追加し,そのインタフェースを使って受け取るようにします.

そのため, int64float64 をそのまま扱うのではなく,以下のようにして新たな型を用意します.

type Int int64
type Float float64

それから,インタフェースを定義して IsNA() などのメソッドを用意します.

Text

Text を忘れていました.
以下のようにします.

type Text []byte

インタフェース

インタフェースは以下のようにします.

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
}

インタフェースの使用

以下の関数以外は問題なく interface{} から Valuer へと移行できました.

func (column *Column) Get(rowID Int, value interface{}) error {
    // ...
}
func (this *Expression) Evaluate(records []Record, values interface{}) error {
    // ...
}

例外

上述の Get()Evaluate() については,呼び出し側で用意した変数を渡して書き込んでもらうという使い方であり,誤って別の型を渡してしまうというケースは少ないと思います.
そういうわけで,これらについては保留しようと思います.

ちなみに, *Valuer[]Valuer では意味が変わってしまうので駄目です.