小编典典

通过Go中的反射检测空值的快速方法

go

我有一个int/ string/ bool/ etc ..值存储在中,interface{}并且想要确定它是否未初始化,这意味着它的值是

  • 0
  • ""
  • false
  • 要么 nil

我该如何检查?


阅读 273

收藏
2020-07-02

共1个答案

小编典典

据我了解,您想要的是:

func IsZeroOfUnderlyingType(x interface{}) bool {
    return x == reflect.Zero(reflect.TypeOf(x)).Interface()
}

在谈论接口和时nil,人们总是对两个截然不同且无关的事物感到困惑:

  1. nil接口值,其是不具有一个接口值 的基础值 。这是接口类型的零值。
  2. nil接口值(即,它具有 基础值 ),但是其基础值是其基础类型的零值。例如,基础值是nil映射,nil指针或0数字等。

据我了解,您正在询问第二件事。


更新 :由于上面的代码的使用==,它对于不可 比较的
类型无效。我相信,使用reflect.DeepEqual()代替将使它适用于所有类型:

func IsZeroOfUnderlyingType(x interface{}) bool {
    return reflect.DeepEqual(x, reflect.Zero(reflect.TypeOf(x)).Interface())
}
2020-07-02