util.go 769 B

12345678910111213141516171819202122232425262728
  1. package litter
  2. import (
  3. "reflect"
  4. )
  5. // deInterface returns values inside of non-nil interfaces when possible.
  6. // This is useful for data types like structs, arrays, slices, and maps which
  7. // can contain varying types packed inside an interface.
  8. func deInterface(v reflect.Value) reflect.Value {
  9. if v.Kind() == reflect.Interface && !v.IsNil() {
  10. v = v.Elem()
  11. }
  12. return v
  13. }
  14. func isPointerValue(v reflect.Value) bool {
  15. switch v.Kind() {
  16. case reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer:
  17. return true
  18. }
  19. return false
  20. }
  21. func isZeroValue(v reflect.Value) bool {
  22. return (isPointerValue(v) && v.IsNil()) ||
  23. (v.IsValid() && v.CanInterface() && reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface()))
  24. }