我需要一个通用函数来检查某些东西是否等于它的零值。
从这个question,我能够找到一个与值类型一起使用的函数。我修改它以支持指针:
func isZeroOfUnderlyingType(x interface{}) bool {
rawType := reflect.TypeOf(x)
//source is a pointer, convert to its value
if rawType.Kind() == reflect.Ptr {
rawType = rawType.Elem()
}
return reflect.DeepEqual(x, reflect.Zero(rawType).Interface())
}
不幸的是,在做这样的事情时,这对我不起作用:
type myStruct struct{}
isZeroOfUnderlyingType(myStruct{}) //Returns true (works)
isZeroOfUnderlyingType(&myStruct{}) //Returns false (doesn't) work
这是因为&myStruct{}
是一个指针,并且无法在函数内取消引用interface{}
。如何将该指针的值与其类型的零值进行比较?
答案 0 :(得分:3)
reflect.Zero()
返回reflect.Value
。 reflect.New()
返回指向零值的指针。
我更新了函数以检查x
是指向某事物的指针的情况:
func isZeroOfUnderlyingType(x interface{}) bool {
rawType := reflect.TypeOf(x)
if rawType.Kind() == reflect.Ptr {
rawType = rawType.Elem()
return reflect.DeepEqual(x, reflect.New(rawType).Interface())
}
return reflect.DeepEqual(x, reflect.Zero(rawType).Interface())
}