nil指向struct的指针不能等于nil?

时间:2017-07-04 07:51:49

标签: pointers go types interface null

如果我的结构包含类型为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不是要走的路,我该怎么办呢?

1 个答案:

答案 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?