【问题标题】:Is there a way to retrieve an entity without using a custom struct?有没有办法在不使用自定义结构的情况下检索实体?
【发布时间】:2018-09-11 21:54:40
【问题描述】:

datastore.Entity 结构看起来非常有用,这就是我想要处理实体的方式,但我没有看到任何使用它的 API。大多数函数(例如Get)采用interface{},只有当它是精确与传入数据结构类似的结构时,它似乎才有效。

// https://godoc.org/cloud.google.com/go/datastore#Client.Get

ctx := context.Background()
client, err := datastore.NewClient(ctx, "project-id")
if err != nil {
    // TODO: Handle error.
}

type Article struct {
    Title       string
    Description string
    Body        string `datastore:",noindex"`
    Author      *datastore.Key
    PublishedAt time.Time
}
key := datastore.NameKey("Article", "articled1", nil)
article := &Article{}
if err := client.Get(ctx, key, article); err != nil {
    // TODO: Handle error.
}

我如何以广义的方式获得这个实体?如果我不完全了解结构怎么办? (更具体地说,如何获取datastore.Entity 的实例?)

【问题讨论】:

    标签: go google-cloud-datastore


    【解决方案1】:

    所以你想要一个可以容纳任何类型实体的“通用”类型? datastore 包已经为您提供了这样的类型:datastore.PropertyList

    你可以这样使用它:

    var entity datastore.PropertyList
    if err := client.Get(ctx, key, &entity); err != nil {
        // TODO: Handle error.
    }
    

    来自datastore的相关文档:

    属性

    实体的内容可以用多种类型表示。这些通常是结构指针,但也可以是实现 PropertyLoadSaver 接口的任何类型。如果使用结构指针,则不必显式实现 PropertyLoadSaver 接口;数据存储区将通过反射自动转换。如果结构指针确实实现了该接口,那么将优先使用这些方法,而不是结构指针的默认行为。结构指针的类型更强,更容易使用; PropertyLoadSavers 更加灵活。

    所以你可以使用任何实现datastore.PropertyLoadSaver 接口的类型。这个接口类型是:

    type PropertyLoadSaver interface {
        Load([]Property) error
        Save() ([]Property, error)
    }
    

    再次引用package doc:

    PropertyLoadSaver 接口

    实体的内容也可以用任何实现 PropertyLoadSaver 接口的类型来表示。这种类型可能是结构指针,但不一定是。数据存储包将在获取实体内容时调用 Load,在放置实体内容时调用 Save。可能的用途包括派生非存储字段、验证字段或仅在字段值为正时为其编制索引。

    [...] *PropertyList 类型实现了 PropertyLoadSaver,因此可以保存任意实体的内容。

    【讨论】:

    • 我在文档中慢慢地盘旋着这个答案。他们第一次对我没有意义。 耸耸肩 这会让我得到我想要的。那么datastore.Entity 类型是为了方便吗?捕捉结果的地方?
    • @TheBuzzSaw datastore.Entity 是为嵌入文档建模。
    • 噢噢,所以我可以将它作为字段之一放入结构中?
    • @TheBuzzSaw 我没试过。其目的是,如果您的实体包含嵌套结构,获取它(例如,进入PropertyList 或任何其他自定义方式),您将获得嵌套结构作为datastore.Entity 的值。
    • 我写了一个例子来加载和保存this unrelated answer中的任意结构。
    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多