3 回答
TA贡献1802条经验 获得超5个赞
p1 == p2
是指针比较,它比较指针值(内存地址)。由于您使用了 2 个复合文字(并获取了它们的地址),它们将指向 2 个不同的变量,因此地址将不同(因为大小Person
不为零)。规范:复合文字:
p3 == p4
比较 struct 值,它逐个字段地比较它们,并且由于匹配的字段具有相等的值,因此比较将导致true
.
比较规则在规范中:比较运算符:
相等运算符 == 和 != 适用于可比较的操作数。排序运算符 <、<=、> 和 >= 适用于已排序的操作数。这些术语和比较结果定义如下:
[...]
指针值是可比较的。如果两个指针值指向同一个变量,或者两者的值都为零,则它们的值相等。指向不同的零大小变量的指针可能相等,也可能不相等。
[...]
如果结构值的所有字段都是可比较的,则结构值是可比较的。如果它们对应的非空白字段相等,则两个结构值相等。
TA贡献1784条经验 获得超8个赞
你的第一个例子
p1 := &Person{name: "guru"}
p2 := &Person{name: "guru"}
fmt.Println(p1 == p2) // false, compares by address?
比较两个指针是否相等。由于它们各自寻址不同的内存地址,因此不相等。
你的第二个例子,
p3 := Person{name: "guru"}
p4 := Person{name: "guru"}
fmt.Println(p3 == p4) // true , why? compares by content?
比较两个结构并按值进行比较,因此它们比较相等。
如果在比较之前取消引用指针,您会发现它们比较相等。例如,给定
p1 := &Person{ name: "guru" }
p2 := &Person{ name: "guru" }
p3 := Person{ name: "guru" }
p4 := Person{ name: "guru" }
以下所有内容均相等:
*p1 == *p2
*p1 == p3
p3 == *p2
p3 == p4
TA贡献1856条经验 获得超17个赞
两个指针值只有在它们指向内存中的相同值或者它们在 Golang 中为 nil 时才相等。您创建了两个结构实例,因此它们具有不同的地址
p1 := &Person{name: "guru"} p2 := &Person{name: "guru"}
- 3 回答
- 0 关注
- 117 浏览
添加回答
举报