英文:
Comparing pointers in Go
问题
我正在阅读我的Go书,它说指针是可比较的。它说:如果两个指针指向同一个变量或者都是nil,那么它们是相等的。
那么为什么我的下面的代码在比较两个指向不同变量的指针时打印出'true'呢?
func main() {
var p = f()
var q = f2()
fmt.Println(*p == *q) // 为什么是true?
}
func f() *int {
v := 1
return &v
}
func f2() *int {
w := 1
return &w
}
英文:
I am reading in my Go book that pointers are comparable. It says: two pointers are equal if and only if they Point to the same variable or both are nil.
So why is my following code printing 'true' when comparing two pointers which are pointing to two different variables?
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
}
答案1
得分: 14
你没有比较指针本身,因为你使用了“解引用运算符”*
,它返回存储在该地址上的值。在你的示例代码中,你调用了返回两个不同指针的方法。存储在这些不同地址上的值恰好都是1
。当你解引用指针时,你获取到存储在那里的值,所以你只是在比较1 == 1
,这是真的。
如果比较指针本身,你会得到false;
package main
import "fmt"
func main() {
var p = f()
var q = f2()
fmt.Println(*p == *q) // 为什么是true?
fmt.Println(p == q) // 指针比较,比较存储的内存地址值
// 而不是该地址值上的值
// 查看你实际获取到的内容
fmt.Println(p) // 这里是十六进制地址值
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
}
你可以在这里查看代码:https://play.golang.org/p/j2FCGHrp18
英文:
You aren't comparing the pointers themselves because you use the 'dereference operator' *
which returns the value stored at that address. In your example code, you've called the methods which returned two different pointers. The value stored at each of those different addresses happens to be 1
. When you derefernce the pointer you get the value stored there so you're just comparing 1 == 1
which is true.
Comparing the pointers themselves you get false;
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
}
答案2
得分: 3
package main
import "fmt"
func main() {
var p = f()
var q = f2()
fmt.Println(*p == *q)
/* 是真的,因为 *p = *q = 1 */
fmt.Println(p == q)
/* 是假的,因为 *p 和 *q 存储了两个不同的内存地址 */
}
func f() *int {
v := 1
return &v
}
func f2() *int {
w := 1
return &w
}
你可以在这个链接中查看代码:https://play.golang.org/p/i1tK4hhjOf
英文:
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
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论