The Round

合同会社ナイツオの開発ブログ

静岡でGo言語やりたい人!!→こちら

GAE/Go Datastore特有の機能~構造化プロパティ~

こんにちは、マツウラです!
これまで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のフィールド名+参照先の構造体フィールド名の組み合わせでプロパティが定義されます。

図1 データストア内の構造化プロパティ

また、Outer構造体でnoindexをタグ付けした場合、平坦化されたフィールドの全ては暗黙的にnoindexが有効になります。


もしGoogle App EnginePython版をさわったことがある人ならNDB APIのStructuredPropertyとよく似ていると思われたと思います。
Go言語版では特に意識することなく簡単に構造体プロパティを扱うことができます。
公式ドキュメントの記述も実にあっさりとしたものです。

今回でGo言語版のDatastoreインターフェースについてはお終いです。