如何知道Golang中任意类型的变量是否为零?

时间:2015-10-14 03:07:54

标签: go reflection go-reflect

因为并非所有类型都具有可比性,例如一片。所以我们不能这样做

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)

关于reflect.DeepEqual

的文档
  

DeepEqual测试深度相等。它尽可能使用normal == equality,但会扫描数组,切片,贴图和结构域的元素。

4 个答案:

答案 0 :(得分:2)

见这篇文章:

Golang: Reflection - How to get zero value of a field type

基本上,您需要针对不可比类型的特殊情况。

答案 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。