比较Go中的指针

时间:2015-12-14 20:41:18

标签: pointers go

我在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
}

2 个答案:

答案 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
}

https://play.golang.org/p/j2FCGHrp18

答案 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
}

https://play.golang.org/p/i1tK4hhjOf