web-dev-qa-db-ja.com

golangの空または不要な構造体フィールド

私は、Goのような型付き言語にやや新しいので、物事を実装するための最良の方法を学ぼうとしています。

Mongodbデータベースに挿入されるモデルを表す2つの構造体があります。 1つの構造(投資)には、フィールドの1つとして他の構造(グループ)があります。

type Group struct {
    Base
    Name string `json:"name" bson"name"`
}

type Investment struct {
    Base
    Symbol string `json:"symbol" bson:"symbol" binding:"required"`
    Group  Group  `json:"group" bson:"group"`
    Fields bson.M `json:"fields" bson:"fields"`
}

私が抱えている問題は、投資モデルではグループが必要ないということです。グループがない場合は、データベースに挿入しない方が良いと思います。 Goでこのようなdbモデルを処理する最良の方法は何ですか?

23
msecret

tl; dr,omitemptyを使用し、 ゼロ値 との違いを心配する必要がある場合null /指定なし、 GitHub APIが行うことを行い、ポインターを使用します


jsonbsonは両方とも,omitemptyタグをサポートします。 jsonの場合、「空の値はfalse、0、任意のnilポインターまたはインターフェイス値、および任意の配列、スライス、マップ、またはstringの長さゼロ」( json docs )。 bsonの場合、,omitemptyは「タイプのゼロ値または空のスライスまたはマップに設定されていない場合にのみフィールドを含める」、および ゼロ値 空の文字列とnilポインターを含める( bson docs )。

したがって、本当にGroup構造体が必要な場合は、代わりに*Groupを挿入できます。ポインターがnilの場合、保存されません。 Investmentがグループのnameのみを保持する必要がある場合は、さらに簡単です。グループ名として""を使用すると、グループキーが保存されなくなります。

bsonはデフォルトで既に小文字のフィールド名を使用しているため、一致する場合はstructタグからそのフィールド名を省略できます。 jsonはデフォルトで大文字の名前になりますので、小文字が必要な場合はタグに小文字の名前を指定してください。

だから、最高の場合、多分あなたはただ使うことができます:

type Investment struct {
    Base
    Symbol string `json:"symbol" binding:"required"`
    Group string  `json:"group,omitempty" bson:",omitempty"`
    Fields bson.M `json:"fields"`
}

タイプのゼロ値( ""、0、falseなど)が "指定されていない"とは異なるフィールドに遭遇した場合、 GitHub APIが行うことを実行し、構造にポインターを置くことができます。 -本質的には*Groupトリックの拡張です。

31
twotwotwo