34 lines
837 B
Go
34 lines
837 B
Go
|
package missinggo
|
||
|
|
||
|
import "reflect"
|
||
|
|
||
|
func IsZeroValue(i interface{}) bool {
|
||
|
return IsEmptyValue(reflect.ValueOf(i))
|
||
|
}
|
||
|
|
||
|
// Returns whether the value represents the empty value for its type. Used for
|
||
|
// example to determine if complex types satisfy the common "omitempty" tag
|
||
|
// option for marshalling. Taken from
|
||
|
// http://stackoverflow.com/a/23555352/149482.
|
||
|
func IsEmptyValue(v reflect.Value) bool {
|
||
|
switch v.Kind() {
|
||
|
case reflect.Func, reflect.Map, reflect.Slice:
|
||
|
return v.IsNil()
|
||
|
case reflect.Array:
|
||
|
z := true
|
||
|
for i := 0; i < v.Len(); i++ {
|
||
|
z = z && IsEmptyValue(v.Index(i))
|
||
|
}
|
||
|
return z
|
||
|
case reflect.Struct:
|
||
|
z := true
|
||
|
for i := 0; i < v.NumField(); i++ {
|
||
|
z = z && IsEmptyValue(v.Field(i))
|
||
|
}
|
||
|
return z
|
||
|
}
|
||
|
// Compare other types directly:
|
||
|
z := reflect.Zero(v.Type())
|
||
|
return v.Interface() == z.Interface()
|
||
|
}
|