我創建了同一個結構的兩個實體,當我比較兩個變數指向結構的實體時,輸出感到困惑。
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?
}
== 運算子是否像多載運算子一樣作業?
uj5u.com熱心網友回復:
p1 == p2是指標比較,它比較指標值(記憶體地址)。由于您使用了 2 個復合文字(并獲取了它們的地址),它們將指向 2 個不同的變數,因此地址將不同(因為大小Person不為零)。規范:復合文字:
獲取復合文字的地址會生成一個指標,該指標指向使用該文字的值初始化的唯一變數。
p3 == p4比較 struct 值,它逐個欄位地比較它們,并且由于匹配的欄位具有相等的值,因此比較將導致true.
比較規則在規范中:比較運算子:
相等運算子 == 和 != 適用于可比較的運算元。排序運算子 <、<=、> 和 >= 適用于已排序的運算元。這些術語和比較結果定義如下:
- [...]
- 指標值是可比較的。如果兩個指標值指向同一個變數,或者兩者的值都為零,則它們的值相等。指向不同的零大小變數的指標可能相等,也可能不相等。
- [...]
- 如果結構值的所有欄位都是可比較的,則結構值是可比較的。如果它們對應的非空白欄位相等,則兩個結構值相等。
uj5u.com熱心網友回復:
你的第一個例子
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 == p3p3 == *p2p3 == p4
uj5u.com熱心網友回復:
兩個指標值只有在它們指向記憶體中的相同值或者它們在 Golang 中為 nil 時才相等。您創建了兩個結構實體,因此它們具有不同的地址
p1 := &Person{name: "guru"}
p2 := &Person{name: "guru"}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430746.html
