You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

46 lines
1.2 KiB

  1. // Copyright 2017, The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE.md file.
  4. package value
  5. import "reflect"
  6. // IsZero reports whether v is the zero value.
  7. // This does not rely on Interface and so can be used on unexported fields.
  8. func IsZero(v reflect.Value) bool {
  9. switch v.Kind() {
  10. case reflect.Bool:
  11. return v.Bool() == false
  12. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  13. return v.Int() == 0
  14. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
  15. return v.Uint() == 0
  16. case reflect.Float32, reflect.Float64:
  17. return v.Float() == 0
  18. case reflect.Complex64, reflect.Complex128:
  19. return v.Complex() == 0
  20. case reflect.String:
  21. return v.String() == ""
  22. case reflect.UnsafePointer:
  23. return v.Pointer() == 0
  24. case reflect.Chan, reflect.Func, reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice:
  25. return v.IsNil()
  26. case reflect.Array:
  27. for i := 0; i < v.Len(); i++ {
  28. if !IsZero(v.Index(i)) {
  29. return false
  30. }
  31. }
  32. return true
  33. case reflect.Struct:
  34. for i := 0; i < v.NumField(); i++ {
  35. if !IsZero(v.Field(i)) {
  36. return false
  37. }
  38. }
  39. return true
  40. }
  41. return false
  42. }