注:古い記事の為、内容が最新ではない可能性がありますm(_ _)m
こんにちは、マツウラです!
これまで2回連続して見てきましたGo言語版のDatastoreインターフェースの機能ですが、3回目の最後は構造化プロパティについてです。
エンティティのプロパティに構造体を渡すことができる、という機能です。
参考:The datastore package - Go — Google Developers The datastore package
構造化プロパティ
構造体にその他の構造体へのポインタがあれば、ネストまたは平坦化されます。
次の定義を例にとってみます。
type Inner1 struct { W int32 X string } type Inner2 struct { Y float64 } type Inner3 struct { Z bool } type Outer struct { A int16 I []Inner1 J Inner2 Inner3 } func StructPro(w http.ResponseWriter, r *http.Request) { c := appengine.NewContext(r) i := []Inner1{ Inner1{W: 10, X: "10"}, Inner1{W: 20, X: "20"}, Inner1{W: 30, X: "30"}, } j := Inner2{Y: 12.34} z := Inner3{Z: true} entity := &Outer{ A: 10, I: i, J: j, Inner3: z, } key := datastore.NewKey(c, "Outer", "outer", 0, nil) _, err := datastore.Put(c, key, entity) var e2 Outer err = datastore.Get(c, key, &e2) fmt.Fprintf(w, "%v %v %v", e2.I[0], e2.J.Y, e2.Z) }
Inner3フィールドはdatastore:"Z"
としてタグ付けされます。
実際にデータストアに格納されると次のように
- I.W
- I.X
- J.Y
- Z
Outerのフィールド名+参照先の構造体フィールド名の組み合わせでプロパティが定義されます。
また、Outer構造体でnoindexをタグ付けした場合、平坦化されたフィールドの全ては暗黙的にnoindexが有効になります。
もしGoogle App EngineのPython版をさわったことがある人ならNDB APIのStructuredPropertyとよく似ていると思われたと思います。
Go言語版では特に意識することなく簡単に構造体プロパティを扱うことができます。
公式ドキュメントの記述も実にあっさりとしたものです。
今回でGo言語版のDatastoreインターフェースについてはお終いです。