当前位置: 首页 > 面试题库 >

指向struct的nil指针不深等于nil吗?

狄溪叠
2023-03-14
问题内容

如果我的结构包含nil类型为的指针A,则reflect.DeepEqual用于检查该属性是否nil会导致false,这使我感到奇怪。

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"

具体来说,我将JSON对象编组到一个结构中,在该结构中,我想测试一个特定的属性是nil当相应的JSON结构不包含该属性时。如果reflect.DeepEqual不是要走的路,我应该怎么做?


问题答案:

您传递给的所有内容都reflect.DeepEqual()包装在一个interface{}值中(如果还没有的话):

func DeepEqual(x, y interface{}) bool

interface{}将比较值,其中第一个参数值 不是nil,仅包装在其中的值。

接口值表示为一(type; value)对。您传递给的第一个值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)))

输出(在Go Playground上尝试):

c.O: <nil>
c.O == nil: true
c.O deep equal to nil: false
c.O deep equal to (*Obj)(nil): true

请参阅以下问题以获得更深入的了解:

隐藏nil值,了解golang为什么会失败

如果要检查包装在非nil接口中的值是否为nil,则可以使用反射:reflect.Value.IsNil()。



 类似资料:
  • 问题内容: 同时,通过去这个教程中去写FUSE文件系统,我遇到了这个神秘的分配: 有人可以解释这种语法的机制吗?它在声明它的上下文中如何适应?据我了解,赋值的结果实际上被忽略了(正确的表达式甚至会导致什么?nir Dir指针?) 问题答案: 这使编译器检查类型是否满足接口。 取得一个指针,使其成为一个指针,并将其分配给接口类型的未命名变量。由于我们从不使用此变量,因此必须将其命名。

  • 指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针,我们就称它为 二级指针,或者 指向指针的指针。 假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示: 将这种关系转换为C语言代码: 指针变

  • 问题内容: 在以下代码段中,尝试将nil接口转换为某物的指针失败,并出现以下错误: 在此处播放链接:https : //play.golang.org/p/2cgyfUStCI 为什么这会完全失败?完全有可能做 ,所以我想知道如何从nil接口开始实现类似的效果。 问题答案: 这是因为 静态 类型的变量(只是一个接口)可能包含许多不同 动态 类型的值。 是的,因为工具,您的变量 可能 持有类型的值,

  • 问题内容: 当值之一为nil时,我尝试对指向指针的映射进行编码时,Gob的Encode返回错误。这似乎与文档相矛盾(但是我可能会误解其含义): 在切片,数组和映射中,即使所有元素均为零,也会传输所有元素,即使是零值元素。 码: 输出: 在这种情况下,料滴是否有充分的理由失败?似乎两个明显的选择之一都比失败更可取:1)不对任何键值为零的键进行编码,或者2)即使值为零也对所有键进行编码。在当前状态下,

  • 在下面给出的代码中,我声明了一个指向int的指针,我们都知道memcpy返回一个指向目标字符串的空指针,所以如果ptr是指向int的指针,那么为什么printf(“%s”,ptr);是完全有效的,ptr毕竟不是指向char的指针。

  • 6. 指向指针的指针与指针数组 指针可以指向基本类型,也可以指向复合类型,因此也可以指向另外一个指针变量,称为指向指针的指针。 int i; int *pi = &i; int **ppi = &pi; 这样定义之后,表达式*ppi取pi的值,表达式**ppi取i的值。请读者自己画图理解i、pi、ppi这三个变量之间的关系。 很自然地,也可以定义指向“指向指针的指针”的指针,但是很少用到: int