有没有不使用自定义结构即可检索实体的方法?

时间:2018-09-11 21:54:40

标签: go google-cloud-datastore

结构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的实例?)

1 个答案:

答案 0 :(得分:2)

因此,您想要一个可以容纳任何类型实体的“通用”类型吗? datastore软件包已经为您提供了这样一种类型:datastore.PropertyList

这是使用方法:

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

来自datastore的相关文档:

  

属性

     

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

因此,您可以使用实现datastore.PropertyLoadSaver接口的任何类型。该接口类型为:

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

再次从package doc报价:

  

PropertyLoadSaver接口

     

实体的内容也可以由实现PropertyLoadSaver接口的任何类型表示。此类型可以是结构指针,但不一定必须如此。数据存储包将在获取实体的内容时调用Load,在放置实体的内容时调用Save。可能的用途包括派生未存储的字段,验证字段或仅当字段的值为正时才对字段建立索引。

     

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