github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/reflectx/empty_value.go (about) 1 package reflectx 2 3 import ( 4 "reflect" 5 ) 6 7 type ZeroChecker interface { 8 IsZero() bool 9 } 10 11 func IsEmptyValue(v reflect.Value) bool { 12 if v.IsValid() && v.CanInterface() { 13 if zeroChecker, ok := v.Interface().(ZeroChecker); ok { 14 return zeroChecker.IsZero() 15 } 16 } 17 18 switch v.Kind() { 19 case reflect.Array, reflect.Map, reflect.Slice, reflect.String: 20 return v.Len() == 0 21 case reflect.Bool: 22 return !v.Bool() 23 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 24 return v.Int() == 0 25 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 26 return v.Uint() == 0 27 case reflect.Float32, reflect.Float64: 28 return v.Float() == 0 29 case reflect.Interface, reflect.Ptr: 30 return v.IsNil() 31 } 32 return false 33 }