首页 > 后端开发 > Golang > 正文

如何在 Go 的 Google App Engine 数据存储中实现动态属性?

Barbara Streisand
发布: 2024-11-23 22:02:11
原创
413 人浏览过

How to Implement Dynamic Properties in Go's Google App Engine Datastore?

在 Google App Engine 数据存储上的 Go 中实现动态属性

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板