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

最佳答案

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

这是您可以使用的方式:

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

datastore 的相关文档:



因此,您可以使用实现 datastore.PropertyLoadSaver 接口(interface)的任何类型。此接口(interface)类型是:
type PropertyLoadSaver interface {
    Load([]Property) error
    Save() ([]Property, error)
}

再次从package doc引用:

关于go - 是否有一种无需使用自定义结构即可检索实体的方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52284710/

10-12 03:54