0
点赞
收藏
分享

微信扫一扫

深度判断一个对象是否是零值


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())
  }
}


举报

相关推荐

0 条评论