为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕沐林林 2021-11-15 16:14:11
因为并非所有类型都具有可比性,例如切片。所以我们不能这样做var v ArbitraryTypev == reflect.Zero(reflect.TypeOf(v)).Interface()编辑 - 解决方案reflect.DeepEqualvar v ArbitratyTypezero := reflect.Zero(reflect.TypeOf(v)).Interface()isZero := reflect.DeepEqual(v, zero)Go 文档关于reflect.DeepEqualDeepEqual 测试深度相等。它在可能的情况下使用普通 == 相等,但会扫描数组、切片、映射和结构字段的元素。
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超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

}

请参阅此处的示例使用。


查看完整回答
反对 回复 2021-11-15
?
偶然的你

TA贡献1841条经验 获得超3个赞

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


reflect.ValueOf(v) == reflect.Zero(reflect.TypeOf(v)))


reflect.DeepEqual(reflect.ValueOf(v), reflect.Zero(reflect.TypeOf(v)))

例如,各种整数 0 风格和未初始化的structs 是“零”


可悲的是,空字符串和数组不是。并nil给出一个例外。

如果你愿意,你可以对这些进行特殊处理。


查看完整回答
反对 回复 2021-11-15
?
当年话下

TA贡献1890条经验 获得超9个赞

Go 1.13Value.IsZero在reflect包中引入了方法。这是您可以使用它检查零值的方法:


if reflect.ValueOf(v).IsZero() {

    // v is zero, do something

}

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


查看完整回答
反对 回复 2021-11-15
  • 3 回答
  • 0 关注
  • 288 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信