func isZero(obj interface{}) bool {
value := reflect.ValueOf(obj)
typ := reflect.TypeOf(obj)
// 处理指针类型
if typ.Kind() == reflect.Ptr {
return value.IsNil() || isZero(value.Elem().Interface())
}
// 处理time.Time类型
if typ == reflect.TypeOf(time.Time{}) {
return value.Interface().(time.Time).IsZero()
}
switch typ.Kind() {
case reflect.Struct:
for i := 0; i < value.NumField(); i++ {
field := value.Field(i)
if !isZero(field.Interface()) {
return false
}
}
return true
case reflect.Map:
if value.Len() == 0 {
return true
}
for _, key := range value.MapKeys() {
if !isZero(value.MapIndex(key)) {
return false
}
}
return true
case reflect.Slice, reflect.Array:
if value.Len() == 0 {
return true
}
for i := 0; i < value.Len(); i++ {
if !isZero(value.Index(i)) {
return false
}
}
return true
default:
// 对于基本类型和时间类型,使用零值进行比较
zeroValue := reflect.Zero(value.Type())
return reflect.DeepEqual(value.Interface(), zeroValue.Interface())
}
}