在 Python 的 App Engine 中,Expando 模型提供了将动态属性分配给实体的便利,而无需预先声明。我们如何在 Go 中复制这个功能?
Go 中实现动态属性的关键是 PropertyLoadSaver 接口。它使实体能够在保存之前动态构造属性。
幸运的是,AppEngine 平台提供了 PropertyList 类型,它实现了 PropertyLoadSaver 接口。使用 PropertyList,您只需将动态属性添加到列表即可轻松添加动态属性。
让我们深入研究一个示例:
import ( "context" "time" datastore "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@domain.com"}, } k := datastore.NewIncompleteKey(ctx, "DynEntity", nil) key, err := datastore.Put(ctx, k, &props) if err != nil { // Handle the error } // ... }
此代码创建一个名为“DynEntity”的实体,具有两个动态属性:“时间”和“电子邮件。”
如果您需要对动态实体进行更多控制,可以在自定义类型上实现 PropertyLoadSaver 接口。例如,让我们定义一个包装地图的自定义 DynEnt 类型:
type DynEnt map[string]interface{} func (d *DynEnt) Load(props []datastore.Property) error { // ... Your implementation } func (d *DynEnt) Save() (props []datastore.Property, err error) { // ... Your implementation }
现在,您可以按如下方式使用 DynEnt:
import ( "context" "time" datastore "google.golang.org/appengine/datastore" ) func main() { ctx := context.Background() d := DynEnt{"email": "example@domain.com", "time": time.Now()} k := datastore.NewIncompleteKey(ctx, "DynEntity", nil) key, err := datastore.Put(ctx, k, &d) if err != nil { // Handle the error } // ... }
以上是如何在 Go 的 Google App Engine 数据存储中实现动态属性?的详细内容。更多信息请关注PHP中文网其他相关文章!