如何知道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
}