如果我的结构包含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 = π 这样定义之后,表达式*ppi取pi的值,表达式**ppi取i的值。请读者自己画图理解i、pi、ppi这三个变量之间的关系。 很自然地,也可以定义指向“指向指针的指针”的指针,但是很少用到: int