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

Eri*_*ner 27 reflection go

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

  • 0
  • ""
  • false
  • 要么 nil

我该如何检查?

new*_*cct 60

根据我的理解,你想要的东西如下:

func IsZeroOfUnderlyingType(x interface{}) bool {
    return x == reflect.Zero(reflect.TypeOf(x)).Interface()
}
Run Code Online (Sandbox Code Playgroud)

在谈论界面时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())
}
Run Code Online (Sandbox Code Playgroud)

  • PS:应该修改为`x == nil || x == reflect.Zero(reflect.TypeOf(x)).接口()`或者它会在`nil'上发生恐慌 (4认同)

Von*_*onC 14

Go 1.13(2019 年第三季度)应该简化检测过程:

Value.IsZero()方法报告 Value 是否为其类型的零值。

这是在实施src/reflect/value.go,从提交c40bffdCL 171337,解决问题7501

请参阅操场示例(只要支持 Go 1.13)