Go App Engine 数据存储区中的动态属性
与 Python 的 App Engine 不同,Go 不提供开箱即用的机制用于创建具有动态属性的实体,其中可以在运行时分配属性。但是,使用 PropertyLoadSaver 接口,可以实现类似的功能。
使用 PropertyList 获取动态属性
Go 的 App Engine 平台提供了 PropertyList 类型,它实现了PropertyLoadSaver 接口允许您在保存时动态构造属性。考虑以下示例:
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@example.com"}, } k := datastore.NewIncompleteKey(ctx, "DynEntity", nil) key, err := datastore.Put(ctx, k, &props) if err != nil { // Handle error } // ... }
在此示例中,我们创建一个名为“DynEntity”的实体,它具有两个动态属性“时间”和“电子邮件”。
创建一个动态属性的自定义类型
在某些情况下,在自定义类型上实现 PropertyLoadSaver 接口可能比使用 PropertyList 更好。例如,您可以在地图类型上实现它:
package main import ( "context" "google.golang.org/appengine/datastore" ) 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() ([]datastore.Property, error) { var props []datastore.Property for k, v := range *d { props = append(props, datastore.Property{Name: k, Value: v}) } return props, nil } func main() { ctx := context.Background() d := DynEnt{"email": "example@example.com", "time": time.Now()} k := datastore.NewIncompleteKey(ctx, "DynEntity", nil) key, err := datastore.Put(ctx, k, &d) if err != nil { // Handle error } // ... }
使用此自定义类型,您可以像 Go 中的任何其他地图一样使用动态属性,但可以从数据存储中存储和检索它们:
d["active"] = true datastore.Put(ctx, key, &d)
以上是如何在 Go App Engine 数据存储区中实现动态属性?的详细内容。更多信息请关注PHP中文网其他相关文章!