func AllFieldsEmpty(v interface{}) bool {
	if v == nil {
		return true
	}

	t := reflect.TypeOf(v)
	if t.Kind() != reflect.Struct && (t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct) {
		if reflect.Zero(t).Interface() != reflect.ValueOf(v).Interface() {
			return false
		}
		return true
	}
	if t.Kind() == reflect.Ptr {
		t = t.Elem()
	}
	for i := 0; i < t.NumField(); i++ {
		var fv reflect.Value
		if reflect.ValueOf(v).Kind() == reflect.Ptr {
			fv = reflect.ValueOf(v).Elem().Field(i)
		} else {
			fv = reflect.ValueOf(v).Elem().Field(i)
		}

		ft := t.Field(i).Type
		fz := reflect.Zero(ft)
		switch ft.Kind() {
		case reflect.Map, reflect.Slice:
			if fv.Len() > 0 {
				return false
			}
		default:
			if fz.Interface() != fv.Interface() {
				return false
			}
		}
	}

	return true
}
func AllFieldsEmpty(v interface{}) bool {
	if v == nil {
		return true
	}

	t := reflect.TypeOf(v)
	if t.Kind() != reflect.Struct && (t.Kind() == reflect.Ptr && t.Elem().Kind() != reflect.Struct) {
		if reflect.Zero(t).Interface() != reflect.ValueOf(v).Interface() {
			return false
		}
		return true
	}
	if t.Kind() == reflect.Ptr {
		t = t.Elem()
	}
	for i := 0; i < t.NumField(); i++ {
		var fv reflect.Value
		if reflect.ValueOf(v).Kind() == reflect.Ptr {
			fv = reflect.ValueOf(v).Elem().Field(i)
		} else {
			fv = reflect.ValueOf(v).Elem().Field(i)
		}

		ft := t.Field(i).Type
		fz := reflect.Zero(ft)
		switch ft.Kind() {
		case reflect.Map, reflect.Slice:
			if fv.Len() > 0 {
				return false
			}
		default:
			if fz.Interface() != fv.Interface() {
				return false
			}
		}
	}

	return true
}
func AllFieldsEmpty ( v interface { } ) bool { if v == nil { return true } t := reflect . TypeOf ( v ) if t . Kind ( ) != reflect . Struct && ( t . Kind ( ) == reflect . Ptr && t . Elem ( ) . Kind ( ) != reflect . Struct ) { if reflect . Zero ( t ) . Interface ( ) != reflect . ValueOf ( v ) . Interface ( ) { return false } return true } if t . Kind ( ) == reflect . Ptr { t = t . Elem ( ) } for i := 0 ; i < t . NumField ( ) ; i ++ { var fv reflect . Value if reflect . ValueOf ( v ) . Kind ( ) == reflect . Ptr { fv = reflect . ValueOf ( v ) . Elem ( ) . Field ( i ) } else { fv = reflect . ValueOf ( v ) . Elem ( ) . Field ( i ) } ft := t . Field ( i ) . Type fz := reflect . Zero ( ft ) switch ft . Kind ( ) { case reflect . Map , reflect . Slice : if fv . Len ( ) > 0 { return false } default : if fz . Interface ( ) != fv . Interface ( ) { return false } } } return true }
// AllFieldsEmpty checks to see if all fields in a given struct are zero
// values. It does not recurse, so finer-grained checking should be done for
// deep accuracy when necessary. It also does not dereference pointers, except
// if the value itself is a pointer and is not nil.
AllFieldsEmpty checks to see if all fields in a given struct are zero values . It does not recurse so finer - grained checking should be done for deep accuracy when necessary . It also does not dereference pointers except if the value itself is a pointer and is not nil .