add IsZero interface to check field value

This commit is contained in:
sdghchj 2020-12-31 00:20:56 +08:00 committed by GitHub
parent 1b8cb07cf2
commit 3bfddf8c74
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -388,16 +388,24 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
// create valuer, setter when parse struct // create valuer, setter when parse struct
func (field *Field) setupValuerAndSetter() { func (field *Field) setupValuerAndSetter() {
// ValueOf // ValueOf
isZero := func(fieldValue reflect.Value) bool{
isZero := fieldValue.IsZero
if zeroer, ok := fieldValue.Interface().(interface{ IsZero() bool }); ok {
isZero = zeroer.IsZero
}
return isZero()
}
switch { switch {
case len(field.StructField.Index) == 1: case len(field.StructField.Index) == 1:
field.ValueOf = func(value reflect.Value) (interface{}, bool) { field.ValueOf = func(value reflect.Value) (interface{}, bool) {
fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0]) fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0])
return fieldValue.Interface(), fieldValue.IsZero() return fieldValue.Interface(), isZero(fieldValue)
} }
case len(field.StructField.Index) == 2 && field.StructField.Index[0] >= 0: case len(field.StructField.Index) == 2 && field.StructField.Index[0] >= 0:
field.ValueOf = func(value reflect.Value) (interface{}, bool) { field.ValueOf = func(value reflect.Value) (interface{}, bool) {
fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0]).Field(field.StructField.Index[1]) fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0]).Field(field.StructField.Index[1])
return fieldValue.Interface(), fieldValue.IsZero() return fieldValue.Interface(), isZero(fieldValue)
} }
default: default:
field.ValueOf = func(value reflect.Value) (interface{}, bool) { field.ValueOf = func(value reflect.Value) (interface{}, bool) {
@ -420,7 +428,7 @@ func (field *Field) setupValuerAndSetter() {
} }
} }
} }
return v.Interface(), v.IsZero() return v.Interface(), isZero(v)
} }
} }