Pointers 指向结构的Nil指针深度不等于Nil?

Pointers 指向结构的Nil指针深度不等于Nil?,pointers,go,types,interface,null,Pointers,Go,Types,Interface,Null,如果我有一个包含nil指针的a类型的结构,使用reflect.DeepEqual检查该属性是否为nil将导致false,这让我感到奇怪 类型容器结构{ O*Obj } 类型Obj结构{ 消息字符串 } var c容器 等式:=反射深度相等(c.O,无) fmt.Printf(“O值:%v,为零:%t”,c.O,等式) //打印:“O值:,为零:假” 具体地说,我正在将一个JSON对象封送到一个结构中,在这里我想测试一个特定的属性是否为nil,而对应的JSON结构不包含它。如果reflect.D

如果我有一个包含
nil
指针的
a
类型的结构,使用
reflect.DeepEqual
检查该属性是否为
nil
将导致
false
,这让我感到奇怪

类型容器结构{
O*Obj
}
类型Obj结构{
消息字符串
}
var c容器
等式:=反射深度相等(c.O,无)
fmt.Printf(“O值:%v,为零:%t”,c.O,等式)
//打印:“O值:,为零:假”
具体地说,我正在将一个JSON对象封送到一个结构中,在这里我想测试一个特定的属性是否为
nil
,而对应的JSON结构不包含它。如果
reflect.DeepEqual
不是一种方法,我应该如何做呢?

您传递给的所有内容都包装在
接口{}
值中(如果还没有):

将比较接口{}
值,其中第一个参数值不是
nil
,只有包装在其中的值

接口值表示为
(类型;值)
对。传递给
reflect.DeepEqual()
的第一个值是一对
(type;value)
(*Obj,nil)
,第二个值是
nil
。他们不平等。第二个值缺少类型信息

如果将其与“键入的”
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)))
输出(在上尝试):

c.O:
c、 O==零:真
c、 O深等于零:错误
c、 O深度等于(*Obj)(无):真
请参阅此问题以获得更深入的了解:

如果要检查包装在非
nil
接口中的值是否为
nil
,可以使用反射:


有关更多详细信息,请参见:

你是对的。。让我们看看文档:。第一段是对你们问题的回答——不同类型的值永远不会完全相等。剩下的答案在这里,谢谢你的界面链接,我今天学到了一些新东西!
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)))
c.O: <nil>
c.O == nil: true
c.O deep equal to nil: false
c.O deep equal to (*Obj)(nil): true