【发布时间】:2018-09-21 22:58:18
【问题描述】:
我的数据模型定义了多个结构,它们都有两个共同的字段:StartDate 和 EndDate。我需要在编组的 JSON 中将这两个字段格式化为 2018-09-21,因此这些结构实现了 Marshaller 接口:
type Results struct {
Source string `json:"source"`
StartDate time.Time
EndDate time.Time
}
type WeightedResults struct {
Source string `json:"source"`
StartDate time.Time
EndDate time.Time
}
func (r Results) MarshalJSON() ([]byte, error) {
type Alias Results
if equalDate(r.StartDate, r.EndDate) {
return json.Marshal(&struct {
Date string `json:"date"`
Alias
}{
Date: r.StartDate.Format(dateFormat),
Alias: (Alias)(r),
})
}
return json.Marshal(&struct {
StartDate string `json:"start_date"`
EndDate string `json:"end_date"`
Alias
}{
StartDate: r.StartDate.Format("2006-01-02"),
EndDate: r.EndDate.Format("2006-01-02"),
Alias: (Alias)(r),
})
}
func (r WeightedResults) MarshalJSON() ([]byte, error) {
type Alias WeightedResults
if equalDate(r.StartDate, r.EndDate) {
return json.Marshal(&struct {
Date string `json:"date"`
Alias
}{
Date: r.StartDate.Format(dateFormat),
Alias: (Alias)(r),
})
}
return json.Marshal(&struct {
StartDate string `json:"start_date"`
EndDate string `json:"end_date"`
Alias
}{
StartDate: r.StartDate.Format("2006-01-02"),
EndDate: r.EndDate.Format("2006-01-02"),
Alias: (Alias)(r),
})
}
上述解决方案运行良好,但会产生大量代码重复。有没有办法重构MarshalJSON 的两个实现以使用相同的逻辑/代码?我很清楚 Go 不提供泛型(还),但必须有另一种方法来解决这个问题,对吧?
【问题讨论】:
-
如果您能够更改模型/json 的结构,那么您可以使用“日期范围”类型来解决您的问题。 (例如play.golang.org/p/Hmvr0sW9gnj)
标签: json generics go marshalling