github.com/golang-infrastructure/go-reflect-utils@v0.0.0-20221130143747-965ef2eb09c3/zero.go (about)

     1  package reflect_utils
     2  
     3  import (
     4  	"math"
     5  	"reflect"
     6  )
     7  
     8  // IsZero 是否是零值,如果是nil的也认为是零值
     9  // 零值包括: 空指针、大小为0的Map、Chan、Slice、Array
    10  func IsZero(value any) bool {
    11  	if IsNil(value) {
    12  		return true
    13  	}
    14  	reflectValue := reflect.ValueOf(value)
    15  	switch reflectValue.Kind() {
    16  	case reflect.Bool:
    17  		return !reflectValue.Bool()
    18  	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
    19  		return reflectValue.Int() == 0
    20  	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
    21  		return reflectValue.Uint() == 0
    22  	case reflect.Float32, reflect.Float64:
    23  		return math.Float64bits(reflectValue.Float()) == 0
    24  	case reflect.Complex64, reflect.Complex128:
    25  		c := reflectValue.Complex()
    26  		return math.Float64bits(real(c)) == 0 && math.Float64bits(imag(c)) == 0
    27  	case reflect.Array:
    28  		for i := 0; i < reflectValue.Len(); i++ {
    29  			if !reflectValue.Index(i).IsZero() {
    30  				return false
    31  			}
    32  		}
    33  		return true
    34  	case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Pointer, reflect.Slice, reflect.UnsafePointer:
    35  		return reflectValue.IsNil()
    36  	case reflect.String:
    37  		return reflectValue.Len() == 0
    38  	case reflect.Struct:
    39  		for i := 0; i < reflectValue.NumField(); i++ {
    40  			if !reflectValue.Field(i).IsZero() {
    41  				return false
    42  			}
    43  		}
    44  		return true
    45  	default:
    46  		return false
    47  	}
    48  }
    49  
    50  // IsNotZero 是否是非零,只是IsZero的简单取反
    51  func IsNotZero(v any) bool {
    52  	return !IsZero(v)
    53  }