code: 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
  }
docs: // 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.