快速的方法来通过围棋反射检测空值(Quick way to detect empty values

2019-07-05 11:43发布

我有一个int / string / bool /等存储在值interface{}并要确定它是否未初始化,意味着它的值是由

  • 0
  • ""
  • false
  • nil

如何检查呢?

Answer 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())
}


Answer 2:

的零值类型的* interface{}是仅nil ,而不是0""false

package main

import "fmt"

func main() {
        var v interface{}
        fmt.Println(v == nil, v == 0, v == "", v == false)
}

(另外http://play.golang.org/p/z1KbX1fOgB )


产量

true false false false

*:提供[Q]当内存分配给存储的值,或者通过声明或品牌或新的呼叫,并没有明确的初始化,内存被赋予一个默认初始化。 这样的值的每个元素被设置为它的类型的零值:假为布尔值,0为整数,0.0漂浮“”字符串,和nil为指针,功能,接口,切片,通道,和地图[ / Q]



Answer 3:

@ newacct的回答无法检测原始零值,调用reflect.Value.Interface()上,这将导致错误。 它可以使用reflect.Value.IsValid()来检查。

// IsValid reports whether v represents a value.
// It returns false if v is the zero Value.
// If IsValid returns false, all other methods except String panic.
// Most functions and methods never return an invalid value.
// If one does, its documentation states the conditions explicitly.
func (v Value) IsValid() bool 

更新方法:

func IsZero(v reflect.Value) bool {
    return !v.IsValid() || reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface())
}

func TestIsZero(t *testing.T) {
    var p *string
    v := reflect.ValueOf(p)

    assert.Equal(t, true, v.IsValid())
    assert.True(t, IsZero(v))

    assert.Equal(t, uintptr(0), v.Pointer())

    v = v.Elem()
    assert.Equal(t, false, v.IsValid())
    assert.True(t, IsZero(v))
}


文章来源: Quick way to detect empty values via reflection in Go
标签: reflection go