为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法在 Golang 中处理带有空格的 Google Datastore Kind

有没有办法在 Golang 中处理带有空格的 Google Datastore Kind

Go
湖上湖 2022-01-10 10:54:50
我在 Datastore 遇到了一个令人讨厌的问题,似乎没有任何解决方法。我正在使用 Google Appengine Datastore 包将投影查询结果拉回 Appengine 内存中进行操作,这是通过将每个实体表示为 Struct 来实现的,每个 Struct 字段对应于一个属性名称,如下所示:type Row struct {Prop1    stringProp2    int}这很好用,但我已将查询扩展到读取其他包含空格的属性名称。虽然查询运行良好,但它无法将数据拉回结构中,因为它希望将给定值放入具有相同命名约定的结构中,并且我遇到了这种错误:datastore: cannot load field "Viewed Registration Page" into a "main.Row": no such struct field显然 Golang 不能像这样表示一个 struct 字段。有一个相关类型的字段,但没有明显的方法告诉查询将其放置在那里。这里最好的解决方案是什么?
查看完整描述

3 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

实际上 Go 支持使用标签将实体属性名称映射到不同的结构字段名称(有关详细信息,请参阅此答案:Go 中标签的用途是什么?)。


例如:


type Row struct {

    Prop1    string `datastore:"Prop1InDs"`

    Prop2    int    `datastore:"p2"`

}

但是,datastore如果您尝试使用包含空格的属性名称,则包的 Go 实现会发生混乱。


总结一下:你不能将有空格的属性名称映射到 Go 中的结构字段(这是一个实现限制,将来可能会改变)。


但好消息是您仍然可以加载这些实体,只是不能加载到结构值中。


您可以将它们加载到类型的变量中datastore.PropertyList。datastore.PropertyList基本上是 的一个切片datastore.Property,其中Property是一个结构,它包含属性的名称、它的值和其他信息。


这是可以做到的:


k := datastore.NewKey(ctx, "YourEntityName", "", 1, nil) // Create the key

e := datastore.PropertyList{}


if err := datastore.Get(ctx, k, &e); err != nil {

    panic(err) // Handle error

}


// Now e holds your entity, let's list all its properties.

// PropertyList is a slice, so we can simply "range" over it:

for _, p := range e {

    ctx.Infof("Property %q = %q", p.Name, p.Value)

}

如果您的实体具有"Have space"value属性"the_value",您将看到例如:


2016-05-05 18:33:47,372 INFO: Property "Have space" = "the_value"

请注意,您可以datastore.PropertyLoadSaver在结构上实现类型并在后台处理它,因此基本上您仍然可以将此类实体加载到结构值中,但您必须自己实现。


但是争取实体名称和属性名称没有空格。如果你允许这些,你会让你的生活更加艰难和悲惨。


查看完整回答
反对 回复 2022-01-10
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

我知道的所有编程语言都将空格视为变量/常量名称的结尾。显而易见的解决方案是避免在属性名称中使用空格。

我还要注意,属性名称成为每个实体和每个索引条目的一部分。我不知道 Google 是否会以某种方式压缩它们,但无论如何我都倾向于使用短属性名称。


查看完整回答
反对 回复 2022-01-10
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

您可以使用注释来重命名属性。


从文档:


// A and B are renamed to a and b.

// A, C and J are not indexed.

// D's tag is equivalent to having no tag at all (E).

// I is ignored entirely by the datastore.

// J has tag information for both the datastore and json packages.

type TaggedStruct struct {

    A int `datastore:"a,noindex"`

    B int `datastore:"b"`

    C int `datastore:",noindex"`

    D int `datastore:""`

    E int

    I int `datastore:"-"`

    J int `datastore:",noindex" json:"j"`

}


查看完整回答
反对 回复 2022-01-10
  • 3 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信