如何在Google Datastore for Golang中忽略struct中的零值?

时间:2015-11-11 14:22:50

标签: go google-apps google-cloud-datastore

我正在尝试使用Google Datastore来存储Go数据。由于EndDate是可选字段,因此不希望在该字段中存储零值。如果我为时间字段制作指针,Google Datastore将发送错误消息 - datastore: unsupported struct field type: *time.Time

如何忽略struct中的零值字段?

type Event struct {
    StartDate time.Time `datastore:"start_date,noindex" json:"startDate"`
    EndDate   time.Time `datastore:"end_date,noindex" json:"endDate"`
}

2 个答案:

答案 0 :(得分:2)

默认保存机制不处理可选字段。字段要么一直保存,要么永远不保存。没有“只有在价值不等于某事的情况下才能保存”。

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

手动保存字段

以下是如何通过手动保存字段(如果它是零值则排除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)
}

答案 1 :(得分:0)

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

  

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

     
      
  • 字段的标记为“ - ”或
  •   
  • 该字段为空,其标签指定“omitempty”选项。
  •   
     

字段int json:"myName,omitempty"