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

我创建了同一个结构的两个实例,当我比较两个变量指向结构的实例时,输出感到困惑。


package main


import "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?

}

== 运算符是否像重载运算符一样工作?


弑天下
浏览 118回答 3
3回答

12345678_0001

p1 == p2是指针比较,它比较指针值(内存地址)。由于您使用了 2 个复合文字(并获取了它们的地址),它们将指向 2 个不同的变量,因此地址将不同(因为大小Person不为零)。规范:复合文字:获取复合文字的地址会生成一个指针,该指针指向使用该文字的值初始化的唯一变量。p3 == p4比较 struct 值,它逐个字段地比较它们,并且由于匹配的字段具有相等的值,因此比较将导致true.比较规则在规范中:比较运算符:相等运算符 == 和 != 适用于可比较的操作数。排序运算符 <、<=、> 和 >= 适用于已排序的操作数。这些术语和比较结果定义如下:[...]指针值是可比较的。如果两个指针值指向同一个变量,或者两者的值都为零,则它们的值相等。指向不同的零大小变量的指针可能相等,也可能不相等。[...]如果结构值的所有字段都是可比较的,则结构值是可比较的。如果它们对应的非空白字段相等,则两个结构值相等。

青春有我

你的第一个例子p1 := &Person{name: "guru"}p2 := &Person{name: "guru"}fmt.Println(p1 == p2) // false, compares by address?比较两个指针是否相等。由于它们各自寻址不同的内存地址,因此不相等。你的第二个例子,&nbsp;p3 := Person{name: "guru"}&nbsp;p4 := Person{name: "guru"}fmt.Println(p3 == p4) // true , why? compares by content?比较两个结构并按值进行比较,因此它们比较相等。如果在比较之前取消引用指针,您会发现它们比较相等。例如,给定p1 := &Person{ name: "guru" }p2 := &Person{ name: "guru" }p3 :=&nbsp; Person{ name: "guru" }p4 :=&nbsp; Person{ name: "guru" }以下所有内容均相等:*p1 == *p2*p1 == &nbsp;p3 p3 == *p2 p3 == &nbsp;p4

慕慕森

两个指针值只有在它们指向内存中的相同值或者它们在 Golang 中为 nil 时才相等。您创建了两个结构实例,因此它们具有不同的地址&nbsp;&nbsp;&nbsp;p1&nbsp;:=&nbsp;&Person{name:&nbsp;"guru"} &nbsp;&nbsp;&nbsp;p2&nbsp;:=&nbsp;&Person{name:&nbsp;"guru"}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go