gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:04:56 24 4
gpt4 key购买 nike

我正在尝试使用 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"`
}

最佳答案

默认保存机制不处理可选字段。字段要么一直保存,要么永远不保存。没有“只有当它的值不等于某物时才保存”这样的东西。

“可选保存的属性”被认为是一种自定义行为,一种自定义保存机制,因此必须手动实现。 Go 的方法是实现 PropertyLoadSaver结构上的接口(interface)。在这里,我提出了 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)
}

关于go - 如何忽略 Golang 的 Google Datastore 结构中的零值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33652561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com