为了账号安全,请及时绑定邮箱和手机立即绑定

golang为什么比较指向结构的两个变量的行为不同?

golang为什么比较指向结构的两个变量的行为不同?

Go
弑天下 2022-11-08 14:50:22
我创建了同一个结构的两个实例,当我比较两个变量指向结构的实例时,输出感到困惑。package mainimport "fmt"type Person struct {    name string}func main() {   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?}== 运算符是否像重载运算符一样工作?
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

p1 == p2是指针比较,它比较指针值(内存地址)。由于您使用了 2 个复合文字(并获取了它们的地址),它们将指向 2 个不同的变量,因此地址将不同(因为大小Person不为零)。规范:复合文字:

获取复合文字的地址会生成一个指针,该指针指向使用该文字的值初始化的唯一变量。

p3 == p4比较 struct 值,它逐个字段地比较它们,并且由于匹配的字段具有相等的值,因此比较将导致true.

比较规则在规范中:比较运算符

相等运算符 == 和 != 适用于可比较的操作数。排序运算符 <、<=、> 和 >= 适用于已排序的操作数。这些术语和比较结果定义如下:

  • [...]

  • 指针值是可比较的。如果两个指针值指向同一个变量,或者两者的值都为零,则它们的值相等。指向不同的零大小变量的指针可能相等,也可能不相等。

  • [...]

  • 如果结构值的所有字段都是可比较的,则结构值是可比较的。如果它们对应的非空白字段相等,则两个结构值相等。


查看完整回答
反对 回复 2022-11-08
?
青春有我

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


查看完整回答
反对 回复 2022-11-08
?
慕慕森

TA贡献1856条经验 获得超17个赞

两个指针值只有在它们指向内存中的相同值或者它们在 Golang 中为 nil 时才相等。您创建了两个结构实例,因此它们具有不同的地址

   p1 := &Person{name: "guru"}
   p2 := &Person{name: "guru"}


查看完整回答
反对 回复 2022-11-08
  • 3 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信