私は、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モデルを処理する最良の方法は何ですか?
tl; dr:,omitempty
を使用し、 ゼロ値 との違いを心配する必要がある場合null /指定なし、 GitHub APIが行うことを行い、ポインターを使用します 。
json
とbson
は両方とも,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
トリックの拡張です。