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  }