code: func IsZero(data interface{}) bool {
  	// check for things that have an IsZero method instead
  	if vv, ok := data.(zeroable); ok {
  		return vv.IsZero()
  	}
  	// continue with slightly more complex reflection
  	v := reflect.ValueOf(data)
  	switch v.Kind() {
  	case reflect.String:
  		return v.Len() == 0
  	case reflect.Bool:
  		return !v.Bool()
  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  		return v.Int() == 0
  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  		return v.Uint() == 0
  	case reflect.Float32, reflect.Float64:
  		return v.Float() == 0
  	case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
  		return v.IsNil()
  	case reflect.Struct, reflect.Array:
  		return reflect.DeepEqual(data, reflect.Zero(v.Type()).Interface())
  	case reflect.Invalid:
  		return true
  	}
  	return false
  }
docs: // IsZero returns true when the value passed into the function is a zero value.
  // This allows for safer checking of interface values.