我正在尝试使用反射从结构中获取时间字段,并通过自定义的UnmarshallJSON函数获取时间字段,看看哪个遇到了时间。IsZero值,而哪些没有。它们以* time.Time的形式出现,我不想使用遗忘(我不能,并且需要这样清除和保留字段)。现在我正在逐个检查每个字段,但是我想知道是否有一种方法可以通过反射使它更健壮,如果添加了另一个时间字段,则不需要为此添加相应的检查。
现在这是我的工作方式:
type A struct {
X *time.Time `json:"x"`
Y *time.Time `json:"y"`
}
func (a *A) UnmarshalJSON(b []byte) (err error) {
type Alias A
s := &struct {
X time.Time `json:"x"`
Y time.Time `json:"y"`
}{
Alias: (*Alias)(a),
}
if err := json.Unmarshal(b, &s); err != nil {
return err
}
if s.X.IsZero() {
a.X = nil
} else {
a.X = &s.X
}
if s.Y.IsZero() {
a.Y = nil
} else {
a.Y = &s.Y
}
我宁愿不必检查每个时间字段,而是要做类似的事情
values := reflect.ValueOf(&s).Elem()
for i := 0; i < values.NumField(); i++ {
fieldName := values.Type().Field(i).Name
fieldValue := values.Field(i).Interface()
if fieldValue == nil {
a.fieldName = nil
} else {
a.fieldName = &s.fieldName
}
当我尝试执行a.fieldName或s.fieldName时出现问题,我缺少什么吗?有没有人遇到这个问题或(希望)解决了这个问题?