如果我的结构包含类型为nil
的{{1}}指针,则使用A
检查该属性是否为reflect.DeepEqual
会导致nil
,这让我感到很奇怪。
false
具体来说,我正在将一个JSON对象编组到一个struct中,当相应的JSON结构不包含它时,我想测试一个特定的属性是type Container struct {
O *Obj
}
type Obj struct {
Message string
}
var c Container
eq := reflect.DeepEqual(c.O, nil)
fmt.Printf("O value: %v, is nil: %t", c.O, eq)
// Prints: "O value: <nil>, is nil: false"
。如果nil
不是要走的路,我该怎么办呢?
答案 0 :(得分:2)
您传递给reflect.DeepEqual()
的所有内容都包含在interface{}
值中(如果它还没有):
func DeepEqual(x, y interface{}) bool
我会比较 interface{}
个值,其中第一个参数值不是nil
,只包含其中包含的值。
接口值表示为(type; value)
对。您传递给reflect.DeepEqual()
的第一个值是一对(type; value)
为(*Obj, nil)
,第二个值为nil
。他们不平等。第二个值缺少类型信息。
如果将其与&#34;键入&#34;进行比较nil
,它将是true
:
reflect.DeepEqual(c.O, (*Obj)(nil)) // This is true
见这个例子:
fmt.Println("c.O:", c.O)
fmt.Println("c.O == nil:", c.O == nil)
fmt.Println("c.O deep equal to nil:", reflect.DeepEqual(c.O, nil))
fmt.Println("c.O deep equal to (*Obj)(nil):", reflect.DeepEqual(c.O, (*Obj)(nil)))
输出(在Go Playground上尝试):
c.O: <nil>
c.O == nil: true
c.O deep equal to nil: false
c.O deep equal to (*Obj)(nil): true
请参阅此问题以获得更深入的见解:
Hiding nil values, understanding why golang fails here
如果您想检查非nil
界面中包含的值是否为nil
,您可以使用反射:reflect.Value.IsNil()。
有关详细信息,请参阅:Why interface type doesn't provide an "IsNil" method?