github.com/podhmo/reflect-shape@v0.4.3/is_zero.go (about) 1 package reflectshape 2 3 import ( 4 "reflect" 5 ) 6 7 func IsZeroRecursive(rt reflect.Type, rv reflect.Value) bool { 8 switch rt.Kind() { 9 case reflect.Bool: 10 return rv.IsZero() 11 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 12 return rv.IsZero() 13 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: 14 return rv.IsZero() 15 case reflect.Float32, reflect.Float64: 16 return rv.IsZero() 17 case reflect.Complex64, reflect.Complex128: 18 return rv.IsZero() 19 case reflect.String: 20 return rv.IsZero() 21 case reflect.Struct: 22 for i := 0; i < rt.NumField(); i++ { 23 ft := rt.Field(i) 24 fv := rv.Field(i) 25 if !IsZeroRecursive(ft.Type, fv) { 26 return false 27 } 28 } 29 return true 30 case reflect.Pointer: 31 if rv.IsNil() { 32 return true 33 } 34 return IsZeroRecursive(rt.Elem(), rv.Elem()) 35 // case reflect.Invalid: 36 // case reflect.Uintptr, reflect.Array, reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Pointer, reflect.Slice, reflect.UnsafePointer: 37 default: 38 return !rv.IsValid() || rv.IsNil() 39 } 40 }