1// Copyright 2017, The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package value 6 7import ( 8 "math" 9 "reflect" 10) 11 12// IsZero reports whether v is the zero value. 13// This does not rely on Interface and so can be used on unexported fields. 14func IsZero(v reflect.Value) bool { 15 switch v.Kind() { 16 case reflect.Bool: 17 return v.Bool() == false 18 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 19 return v.Int() == 0 20 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 21 return v.Uint() == 0 22 case reflect.Float32, reflect.Float64: 23 return math.Float64bits(v.Float()) == 0 24 case reflect.Complex64, reflect.Complex128: 25 return math.Float64bits(real(v.Complex())) == 0 && math.Float64bits(imag(v.Complex())) == 0 26 case reflect.String: 27 return v.String() == "" 28 case reflect.UnsafePointer: 29 return v.Pointer() == 0 30 case reflect.Chan, reflect.Func, reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: 31 return v.IsNil() 32 case reflect.Array: 33 for i := 0; i < v.Len(); i++ { 34 if !IsZero(v.Index(i)) { 35 return false 36 } 37 } 38 return true 39 case reflect.Struct: 40 for i := 0; i < v.NumField(); i++ { 41 if !IsZero(v.Field(i)) { 42 return false 43 } 44 } 45 return true 46 } 47 return false 48} 49