zero.go 992 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package pretty
  2. import (
  3. "reflect"
  4. )
  5. func nonzero(v reflect.Value) bool {
  6. switch v.Kind() {
  7. case reflect.Bool:
  8. return v.Bool()
  9. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  10. return v.Int() != 0
  11. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  12. return v.Uint() != 0
  13. case reflect.Float32, reflect.Float64:
  14. return v.Float() != 0
  15. case reflect.Complex64, reflect.Complex128:
  16. return v.Complex() != complex(0, 0)
  17. case reflect.String:
  18. return v.String() != ""
  19. case reflect.Struct:
  20. for i := 0; i < v.NumField(); i++ {
  21. if nonzero(getField(v, i)) {
  22. return true
  23. }
  24. }
  25. return false
  26. case reflect.Array:
  27. for i := 0; i < v.Len(); i++ {
  28. if nonzero(v.Index(i)) {
  29. return true
  30. }
  31. }
  32. return false
  33. case reflect.Map, reflect.Interface, reflect.Slice, reflect.Ptr, reflect.Chan, reflect.Func:
  34. return !v.IsNil()
  35. case reflect.UnsafePointer:
  36. return v.Pointer() != 0
  37. }
  38. return true
  39. }