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

如何在 Golang 的 Google Datastore 中忽略结构中的零值?

如何在 Golang 的 Google Datastore 中忽略结构中的零值?

Go
回首忆惘然 2021-11-22 15:32:42
我正在尝试使用 Google Datastore 通过 Go 存储数据。由于EndDate是可选字段,并且不想在该字段中存储零值。如果我为时间字段设置指针,Google Datastore 将发送错误消息 -datastore: unsupported struct field type: *time.Time如何忽略结构中的零值字段?type Event struct {    StartDate time.Time `datastore:"start_date,noindex" json:"startDate"`    EndDate   time.Time `datastore:"end_date,noindex" json:"endDate"`}
查看完整描述

2 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

默认保存机制不处理可选字段。一个字段要么一直保存,要么从不保存。没有“仅在其价值不等于某物时才保存”之类的东西。


“可选保存的属性”被视为自定义行为、自定义保存机制,因此必须手动实现。Go 的方法是PropertyLoadSaver在你的结构上实现接口。在这里,我提出了 2 种不同的方法来实现这一目标:


手动保存字段

这是一个如何通过手动保存字段(并排除EndDate它是否为零值)来执行此操作的示例:


type Event struct {

    StartDate time.Time `datastore:"start_date,noindex" json:"startDate"`

    EndDate   time.Time `datastore:"end_date,noindex" json:"endDate"`

}


func (e *Event) Save(c chan<- datastore.Property) error {

    defer close(c)

    // Always save StartDate:

    c <- datastore.Property{Name:"start_date", Value:e.StartDate, NoIndex: true}


    // Only save EndDate if not zero value:

    if !e.EndDate.IsZero() {

        c <- datastore.Property{Name:"end_date", Value:e.EndDate, NoIndex: true}

    }

    return nil

}


func (e *Event) Load(c chan<- datastore.Property) error {

    // No change required in loading, call default implementation:

    return datastore.LoadStruct(e, c)

}

与另一个结构

这是使用另一个结构的另一种方法。在Load()实施永远是一样的,唯一的Save()不同:


func (e *Event) Save(c chan<- datastore.Property) error {

    if !e.EndDate.IsZero() {

        // If EndDate is not zero, save as usual:

        return datastore.SaveStruct(e, c)

    }


    // Else we need a struct without the EndDate field:

    s := struct{ StartDate time.Time `datastore:"start_date,noindex"` }{e.StartDate}

    // Which now can be saved using the default saving mechanism:

    return datastore.SaveStruct(&s, c)

}


查看完整回答
反对 回复 2021-11-22
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

在字段标签中使用省略。来自文档:https : //golang.org/pkg/encoding/json/

结构值编码为 JSON 对象。每个导出的结构字段都成为对象的成员,除非

  • 该字段的标签是“-”,或

  • 该字段为空,其标签指定了“omitempty”选项。

字段整数 json:"myName,omitempty"


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

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