猿问

有没有办法在不使用自定义结构的情况下检查实体?

struct datastore.Entity看起来非常有用,这就是我想要处理实体的方式,但我没有看到任何使用它的 API。大多数函数(例如Get)都采用一个that 只有当它是结构与传入数据一样精确的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.

}

我将如何以通用方式获得该实体?如果我不完全了解结构怎么办?(更具体地说,我如何获得 instead 的实例datastore.Entity?)


素胚勾勒不出你
浏览 103回答 1
1回答

翻翻过去那场雪

所以你想要一个可以容纳任何类型实体的“通用”类型?该datastore软件包已经为您提供了这样一种类型:datastore.PropertyList.这是您可以使用它的方式:var entity datastore.PropertyListif 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) }再次引用包文档:PropertyLoadSaver 接口实体的内容也可以由实现 PropertyLoadSaver 接口的任何类型表示。此类型可以是结构指针,但不一定是。datastore包在获取实体内容时调用Load,在放入实体内容时调用Save。可能的用途包括派生非存储字段、验证字段或仅在其值为正时索引字段。[...] *PropertyList 类型实现了 PropertyLoadSaver,因此可以保存任意实体的内容。
随时随地看视频慕课网APP

相关分类

Go
我要回答