我有一个int
/ string
/ bool
/等存储在值interface{}
并要确定它是否未初始化,意味着它的值是由
-
0
-
""
-
false
- 或
nil
如何检查呢?
我有一个int
/ string
/ bool
/等存储在值interface{}
并要确定它是否未初始化,意味着它的值是由
0
""
false
nil
如何检查呢?
据我了解,你想是这样的:
func IsZeroOfUnderlyingType(x interface{}) bool {
return x == reflect.Zero(reflect.TypeOf(x)).Interface()
}
在谈到接口和nil
,人们总是会混淆两个非常不同的和无关的事情:
nil
接口值,其是不具有潜在价值的接口值。 这是一个接口类型的零值。 nil
接口值(即,它具有一个基本值 ),但其基础值是其基础类型的零值。 例如基础值是一个nil
图, nil
指针,或0号等 这是我的理解是你问的第二件事。
更新 :由于使用上面的代码==
,它不会是没有可比性的工作类型。 我相信使用reflect.DeepEqual()
而不是将使其成为所有类型的工作:
func IsZeroOfUnderlyingType(x interface{}) bool {
return reflect.DeepEqual(x, reflect.Zero(reflect.TypeOf(x)).Interface())
}
的零值类型的* 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]
@ 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))
}