猿问

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

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


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)

Go 文档关于reflect.DeepEqual


DeepEqual 测试深度相等。它在可能的情况下使用普通 == 相等,但会扫描数组、切片、映射和结构字段的元素。


慕沐林林
浏览 289回答 3
3回答

智慧大石

正如 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}请参阅此处的示例使用。

偶然的你

以下两个都给了我合理的结果(可能是因为它们是相同的?)reflect.ValueOf(v) == reflect.Zero(reflect.TypeOf(v)))reflect.DeepEqual(reflect.ValueOf(v), reflect.Zero(reflect.TypeOf(v)))例如,各种整数 0 风格和未初始化的structs 是“零”可悲的是,空字符串和数组不是。并nil给出一个例外。如果你愿意,你可以对这些进行特殊处理。

当年话下

Go 1.13Value.IsZero在reflect包中引入了方法。这是您可以使用它检查零值的方法:if reflect.ValueOf(v).IsZero() {    // v is zero, do something}除了基本类型,它还适用于 Chan、Func、Array、Interface、Map、Ptr、Slice、UnsafePointer 和 Struct。
随时随地看视频慕课网APP

相关分类

Go
我要回答