Go 在自定义解组函数中使用时间字段上的反射
我正在尝试使用反射从结构中获取时间字段,并通过自定义的UnmarshallJSON func,查看哪些字段显示为time.IsZero值,哪些字段不显示。它们被理解为*time.time,我不想使用ommitempty(因为我不能,需要清除字段并将其保持为空)。现在,我正在逐个检查每个字段,但我想知道是否有一种方法可以通过反射使其更加健壮,如果添加了另一个时间字段,我不需要为其添加相应的检查 现在我就是这么做的:Go 在自定义解组函数中使用时间字段上的反射,go,reflection,Go,Reflection,我正在尝试使用反射从结构中获取时间字段,并通过自定义的UnmarshallJSON func,查看哪些字段显示为time.IsZero值,哪些字段不显示。它们被理解为*time.time,我不想使用ommitempty(因为我不能,需要清除字段并将其保持为空)。现在,我正在逐个检查每个字段,但我想知道是否有一种方法可以通过反射使其更加健壮,如果添加了另一个时间字段,我不需要为其添加相应的检查 现在我就是这么做的: type A struct { X *time.Time `json:"x
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是一种完全编译时静态语言。您必须继续使用反射来访问这些域并设置它们的值。@您是否考虑过使用一种包装器类型来嵌入时间指针?