亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號