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

如何知道Golang中任意类型的变量是否为零?,go,reflection,go-reflect,Go,Reflection,Go Reflect,因为并非所有类型都具有可比性,例如切片。所以我们不能这么做 var v ArbitraryType v == reflect.Zero(reflect.TypeOf(v)).Interface() 编辑-解决方案反映.DeepEqual var v ArbitratyType zero := reflect.Zero(reflect.TypeOf(v)).Interface() isZero := reflect.DeepEqual(v, zero) 查阅文件 深度相等测试深度相等。它尽可能

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

var v ArbitraryType
v == reflect.Zero(reflect.TypeOf(v)).Interface()
编辑-解决方案反映.DeepEqual

var v ArbitratyType
zero := reflect.Zero(reflect.TypeOf(v)).Interface()
isZero := reflect.DeepEqual(v, zero)
查阅文件

深度相等测试深度相等。它尽可能使用normal==相等,但将扫描数组、切片、映射和结构字段的元素

见此帖:


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

正如Peter Noyes指出的,您只需要确保您没有比较不可比较的类型。幸运的是,对于
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
}

请参阅使用示例。

以下两种方法都给了我合理的结果(可能是因为它们相同?)

e、 g.各种整数0风格和未初始化的
struct
s为“零”

遗憾的是,空字符串和数组不是。而
nil
给出了一个例外。

如果需要,您可以对这些进行特殊处理。

Go 1.13引入了
值。
包中的IsZero
方法。以下是使用它检查零值的方法:

if reflect.ValueOf(v).IsZero() {
    // v is zero, do something
}

除了基本类型外,它还适用于Chan、Func、Array、Interface、Map、Ptr、Slice、UnsafePointer和Struct。

Hi Rhythmatic,感谢您的回复!实际上,==和DeepEqual是不同的。DeepEqual适用于可比变量和不可比变量,根据go文档,我还不了解可比变量,我会查看它,谢谢。
if reflect.ValueOf(v).IsZero() {
    // v is zero, do something
}