栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Google App Engine数据存储区中添加动态属性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Google App Engine数据存储区中添加动态属性

事先注意:

有2个API。具有导入路径的那个

appengine/datastore
使用通道作为参数。具有导入路径的另一个
google.golang.org/appengine/datastore
使用切片。根据您的情况调整以下示例。


具有动态属性的实体的关键是

PropertyLoadSaver
接口。通过实现此接口,您可以在保存时动态地构造要保存的实体的属性。

同样,不必自己执行此操作,Go
AppEngine平台提供了一种

PropertyList
类型,该类型基本上是属性列表(切片),
Property
并且也实现了
PropertyLoadSaver

因此Go中的Expando模型为

PropertyList
。只需添加您希望实体拥有的属性,然后保存该
PropertyList
值即可。

这是一个例子:

c := appengine.NewContext(r)props := datastore.PropertyList{    datastore.Property{Name: "time", Value: time.Now()},    datastore.Property{Name: "email", Value: "me@myhost.com"},}k := datastore.NewIncompleteKey(c, "DynEntity", nil)key, err := datastore.Put(c, k, &props)c.Infof("%v %v", key, err)

本示例将保存一个

"DynEntity"
具有2个动态属性的实体:
"time"
"email"

由于

PropertyList
类型是切片,因此您还可以使用内置
append()
函数为其添加属性,因此也可以
props
像这样进行初始化:

var props datastore.PropertyListprops = append(props, datastore.Property{Name:"time", Value: time.Now()})props = append(props, datastore.Property{Name:"email", Value: "me@myhost.com"})

map
变成动态实体

PropertyLoadSaver
界面并不复杂,我们可以实现它自己。在以下示例中,我在一个简单的自定义类型上实现了它
map

type DynEnt map[string]interface{}func (d *DynEnt) Load(props []datastore.Property) error {    // Note: you might want to clear current values from the map or create a new map    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}

这是使用通道而不是切片的“旧”接口的实现的样子:

type DynEnt map[string]interface{}func (d *DynEnt) Load(ch <-chan datastore.Property) error {    // Note: you might want to clear current values from the map or create a new map    for p := range ch { // Read until channel is closed        (*d)[p.Name] = p.Value    }    return nil}func (d *DynEnt) Save(ch chan<- datastore.Property) error {    defer close(ch) // Channel must be closed    for k, v := range *d {        ch <- datastore.Property{Name: k, Value: v}    }    return nil}

现在,我们可以

DynEnt
像Go中的任何其他地图一样使用我们的类型,并且由于它实现了
PropertyLoadSaver
,因此可以将其保存为实体(并且可以将
任何 实体加载到其中):

c := appengine.NewContext(r)d := DynEnt{"email": "me@myhost.com", "time": time.Now()}k := datastore.NewIncompleteKey(c, "DynEntity", nil)key, err := datastore.Put(c, k, &d)c.Infof("%v %v", key, err)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/471076.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号