我在Go的书中读到指针是可比较的。它说:当且仅当它们指向同一个变量或两者都是零时,两个指针是相等的。
那么为什么我的以下代码打印真实'比较两个指向两个不同变量的指针?
func main() {
var p = f()
var q = f2()
fmt.Println(*p == *q) // why true?
}
func f() *int {
v := 1
return &v
}
func f2() *int {
w := 1
return &w
}
答案 0 :(得分:9)
您没有比较指针本身,因为您使用'derefernce operator'*
返回存储在该地址的值。在您的示例代码中,您调用了返回两个不同指针的方法。存储在每个不同地址的值恰好是1
。当您取消指针时,您会获得存储在那里的值,因此您只需比较1 == 1
即可。
比较指针本身就是假的;
package main
import "fmt"
func main() {
var p = f()
var q = f2()
fmt.Println(*p == *q) // why true?
fmt.Println(p == q) // pointer comparison, compares the memory address value stored
// rather than the the value which resides at that address value
// check out what you're actually getting
fmt.Println(p) // hex address values here
fmt.Println(q)
fmt.Println(*p) // 1
fmt.Println(*q) // 1
}
func f() *int {
v := 1
return &v
}
func f2() *int {
w := 1
return &w
}
答案 1 :(得分:1)
package main
import "fmt"
func main() {
var p = f()
var q = f2()
fmt.Println(*p == *q)
/* is true, since *p = *q = 1 */
fmt.Println(p == q)
/* is false, since *p and *q store two different memory addresses */
}
func f() *int {
v := 1
return &v
}
func f2() *int {
w := 1
return &w
}