Google App Engine データストアでは、エンティティのプロパティを動的に定義する必要があるシナリオが発生する場合があります。この記事では、Go で動的プロパティ処理を実現するための Python の Expando モデルに似た手法について説明します。
動的プロパティを作成する鍵は、PropertyLoadSaver インターフェイスにあります。このインターフェイスを実装すると、保存時にエンティティのプロパティを動的に構築できます。
便利なことに、Go AppEngine プラットフォームでは、Property オブジェクトのスライスである PropertyList タイプが提供されます。また、PropertyLoadSaver も実装します。 Go で Expando モデルを作成するには、単に PropertyList タイプを使用します。必要なプロパティを追加すると、これらはエンティティの一部として保存されます。
package main import ( "context" "time" "google.golang.org/appengine/datastore" ) func main() { ctx := context.Background() props := datastore.PropertyList{ datastore.Property{Name: "time", Value: time.Now()}, datastore.Property{Name: "email", Value: "example@email.com"}, } k := datastore.NewIncompleteKey(ctx, "DynEntity", nil) key, err := datastore.Put(ctx, k, &props) if err != nil { // Handle error } c.Infof("%v", key) }
この例では、「DynEntity」という名前のエンティティが、「time」と「time」という 2 つの動的プロパティとともに保存されます。 "email."
次のようなカスタム タイプを使用して PropertyLoadSaver インターフェイスを実装することもできます。地図。次のコード スニペットは、マップをラップする DynEnt タイプを作成する方法を示しています。
type DynEnt map[string]interface{} func (d *DynEnt) Load(props []datastore.Property) error { for _, p := range props { (*d)[p.Name] = p.Value } return nil } func (d *DynEnt) Save() (props []datastore.Property, err error) { for k, v := range *d { props = append(props, datastore.Property{Name: k, Value: v}) } return }
このカスタム タイプは、エンティティを動的にロードおよび保存するために使用できます。
d := DynEnt{"email": "example@email.com", "time": time.Now()} k := datastore.NewIncompleteKey(ctx, "DynEntity", nil) key, err := datastore.Put(ctx, k, &d) if err != nil { // Handle error } c.Infof("%v", key)
このアプローチでは、次のことが可能になります。 Google App Engine データストア内のエンティティに動的プロパティを追加する柔軟な方法。
以上がGoogle App Engine の Go データストアに動的プロパティを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。