在 Google App Engine 数据存储区中,您可能会遇到需要动态定义实体属性的情况。本文探讨了一种类似于 Python Expando Model 的技术来实现 Go 中的动态属性处理。
创建动态属性的关键在于 PropertyLoadSaver 接口。通过实现此接口,您可以在保存时动态构造实体的属性。
方便的是,Go AppEngine 平台提供了 PropertyList 类型,它是 Property 对象的切片并且还实现了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”的实体保存有两个动态属性:“时间”和“时间” “电子邮件。”
您还可以使用自定义类型(例如地图)实现 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中文网其他相关文章!