当前位置:  开发笔记 > 编程语言 > 正文

比较Go中的指针

如何解决《比较Go中的指针》经验,为你挑选了1个好方法。

我在Go书中读到指针是可比较的.它说:当且仅当它们指向同一个变量或两者都是零时,两个指针是相等的.

那么为什么在比较指向两个不同变量的两个指针时,我的以下代码打印为'true'?

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
}

evanmcdonnal.. 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> evanmcdonnal..:

您没有比较指针本身,因为您使用'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


你认为比较哪些方法?他正在比较两个`*int`,两者都是1,因此在解除引用后它们是相等的.
推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有