Go 在自定义解组函数中使用时间字段上的反射

Go 在自定义解组函数中使用时间字段上的反射,go,reflection,Go,Reflection,我正在尝试使用反射从结构中获取时间字段,并通过自定义的UnmarshallJSON func,查看哪些字段显示为time.IsZero值,哪些字段不显示。它们被理解为*time.time,我不想使用ommitempty(因为我不能,需要清除字段并将其保持为空)。现在,我正在逐个检查每个字段,但我想知道是否有一种方法可以通过反射使其更加健壮,如果添加了另一个时间字段,我不需要为其添加相应的检查 现在我就是这么做的: type A struct { X *time.Time `json:"x

我正在尝试使用反射从结构中获取时间字段,并通过自定义的UnmarshallJSON func,查看哪些字段显示为time.IsZero值,哪些字段不显示。它们被理解为*time.time,我不想使用ommitempty(因为我不能,需要清除字段并将其保持为空)。现在,我正在逐个检查每个字段,但我想知道是否有一种方法可以通过反射使其更加健壮,如果添加了另一个时间字段,我不需要为其添加相应的检查

现在我就是这么做的:

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
    }
value:=reflect.ValueOf(&s).Elem()
对于i:=0;i

当我尝试使用a.fieldName或s.fieldName时,会出现问题,我是否遗漏了什么?是否有人遇到过这种情况或(希望如此)解决了这个问题?

您不能这样动态引用结构域,Go是一种完全编译时静态语言。您必须继续使用反射来访问这些域并设置它们的值。@您是否考虑过使用一种包装器类型来嵌入时间指针?