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  }