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)
}
TA贡献1803条经验 获得超3个赞
在字段标签中使用省略。来自文档:https : //golang.org/pkg/encoding/json/
结构值编码为 JSON 对象。每个导出的结构字段都成为对象的成员,除非
该字段的标签是“-”,或
该字段为空,其标签指定了“omitempty”选项。
字段整数
json:"myName,omitempty"
- 2 回答
- 0 关注
- 151 浏览
添加回答
举报