3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個贊
p1 == p2
是指針比較,它比較指針值(內(nèi)存地址)。由于您使用了 2 個復(fù)合文字(并獲取了它們的地址),它們將指向 2 個不同的變量,因此地址將不同(因?yàn)榇笮?code>Person不為零)。規(guī)范:復(fù)合文字:
獲取復(fù)合文字的地址會生成一個指針,該指針指向使用該文字的值初始化的唯一變量。
p3 == p4
比較 struct 值,它逐個字段地比較它們,并且由于匹配的字段具有相等的值,因此比較將導(dǎo)致true
.
比較規(guī)則在規(guī)范中:比較運(yùn)算符:
相等運(yùn)算符 == 和 != 適用于可比較的操作數(shù)。排序運(yùn)算符 <、<=、> 和 >= 適用于已排序的操作數(shù)。這些術(shù)語和比較結(jié)果定義如下:
[...]
指針值是可比較的。如果兩個指針值指向同一個變量,或者兩者的值都為零,則它們的值相等。指向不同的零大小變量的指針可能相等,也可能不相等。
[...]
如果結(jié)構(gòu)值的所有字段都是可比較的,則結(jié)構(gòu)值是可比較的。如果它們對應(yīng)的非空白字段相等,則兩個結(jié)構(gòu)值相等。

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個贊
你的第一個例子
p1 := &Person{name: "guru"}
p2 := &Person{name: "guru"}
fmt.Println(p1 == p2) // false, compares by address?
比較兩個指針是否相等。由于它們各自尋址不同的內(nèi)存地址,因此不相等。
你的第二個例子,
p3 := Person{name: "guru"}
p4 := Person{name: "guru"}
fmt.Println(p3 == p4) // true , why? compares by content?
比較兩個結(jié)構(gòu)并按值進(jìn)行比較,因此它們比較相等。
如果在比較之前取消引用指針,您會發(fā)現(xiàn)它們比較相等。例如,給定
p1 := &Person{ name: "guru" }
p2 := &Person{ name: "guru" }
p3 := Person{ name: "guru" }
p4 := Person{ name: "guru" }
以下所有內(nèi)容均相等:
*p1 == *p2
*p1 == p3
p3 == *p2
p3 == p4

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個贊
兩個指針值只有在它們指向內(nèi)存中的相同值或者它們在 Golang 中為 nil 時才相等。您創(chuàng)建了兩個結(jié)構(gòu)實(shí)例,因此它們具有不同的地址
p1 := &Person{name: "guru"} p2 := &Person{name: "guru"}
- 3 回答
- 0 關(guān)注
- 154 瀏覽
添加回答
舉報