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 關注
- 147 瀏覽
添加回答
舉報