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 }