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

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

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

Go
素胚勾勒不出你 2023-04-04 14:17:26
struct datastore.Entity看起来非常有用,这就是我想要处理实体的方式,但我没有看到任何使用它的 API。大多数函数(例如Get)都采用一个that 只有当它是结构与传入数据一样精确的interface{}结构时才似乎有效。// https://godoc.org/cloud.google.com/go/datastore#Client.Getctx := 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?)
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

所以你想要一个可以容纳任何类型实体的“通用”类型?该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)
}

再次引用包文档:

PropertyLoadSaver 接口

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

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


查看完整回答
反对 回复 2023-04-04
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

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