因为并非所有类型都具有可比性,例如一片。所以我们不能这样做
var v ArbitraryType
v == reflect.Zero(reflect.TypeOf(v)).Interface()
编辑 - 解决方案reflect.DeepEqual
var v ArbitratyType
zero := reflect.Zero(reflect.TypeOf(v)).Interface()
isZero := reflect.DeepEqual(v, zero)
的文档
DeepEqual测试深度相等。它尽可能使用normal == equality,但会扫描数组,切片,贴图和结构域的元素。
答案 0 :(得分:2)
答案 1 :(得分:2)
正如彼得·诺伊斯指出的那样,你只需要确保你没有比较一种不具有可比性的类型。幸运的是,使用reflect
包非常简单:
func IsZero(v interface{}) (bool, error) {
t := reflect.TypeOf(v)
if !t.Comparable() {
return false, fmt.Errorf("type is not comparable: %v", t)
}
return v == reflect.Zero(t).Interface(), nil
}
请参阅示例使用here。
答案 2 :(得分:2)
以下两点都给出了合理的结果(可能是因为它们相同?)
reflect.ValueOf(v) == reflect.Zero(reflect.TypeOf(v)))
reflect.DeepEqual(reflect.ValueOf(v), reflect.Zero(reflect.TypeOf(v)))
e.g。各种整数0种口味和未初始化的struct
是"零"
可悲的是,空字符串和数组不是。并且nil
给出例外。
如果你愿意,你可以使用特殊情况。
答案 3 :(得分:1)
Go 1.13在Value.IsZero
包中引入了reflect
方法。这是您可以使用它检查零值的方法:
if reflect.ValueOf(v).IsZero() {
// v is zero, do something
}
除基本类型外,它还适用于Chan,Func,Array,Interface,Map,Ptr,Slice,UnsafePointer和Struct。