在 Python 的 App Engine 中,Expando 模型无需事先声明即可将属性动态分配给实体。本文探讨了如何使用 Google App Engine 数据存储在 Go 中实现类似的功能。
在 Go 中定义动态实体的关键是 PropertyLoadSaver 接口。通过实现此接口,您可以在节省时间的情况下动态构造实体的属性。
Go App Engine 平台提供 PropertyList 类型,该类型是 Property 实例的列表,并实现 PropertyLoadSaver 接口。通过利用 PropertyList,您可以创建动态实体,而无需自己实现接口。
props := datastore.PropertyList{ {Name: "time", Value: time.Now()}, {Name: "email", Value: "johndoe@example.com"}, }
要将此列表保存为实体,您可以使用:
key, err := datastore.Put(c, k, &props)
为了进一步提高灵活性,您可以在自己的自定义类型上实现 PropertyLoadSaver 接口,例如地图。
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": "johndoe@example.com", "time": time.Now()} key, err := datastore.Put(c, k, &d)
此方法使您可以完全控制动态实体的属性定义.
以上是如何在 Go 的 Google App Engine 数据存储中创建动态实体?的详细内容。更多信息请关注PHP中文网其他相关文章!