【问题标题】:Comparing pointers in Go比较 Go 中的指针
【发布时间】:2016-03-20 11:24:13
【问题描述】:

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

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

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
}

【问题讨论】:

  • 您正在比较存储在指针中的值,而不是指针本身。试试fmt.Println(p == q)
  • question 相关(不是欺骗)< / > 运营商。

标签: pointers go


【解决方案1】:

您没有比较指针本身,因为您使用了“取消引用运算符”*,它返回存储在该地址的值。在您的示例代码中,您调用了返回两个不同指针的方法。存储在每个不同地址的值恰好是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

【讨论】:

  • 你确定吗?这两个变量应该保存函数返回的值(即结果的地址)
  • 好的,明白了。但是为什么 f() == f() 是错误的。每次调用 f() 都应该返回一个指向同一个变量的指针?
  • 您认为比较了哪些方法?他在比较两个*int,两者都是1,所以取消引用后它们相等。
  • @fufex79 只有当编译器优化函数调用以返回相同的值(相同的地址)时,这些值才会相等,但是他不应该这样做,因为该值可能会在以后被修改。所以每次调用函数都会创建一个新变量(带有新地址)
  • @JimB 正如我最初所说,我不确定正在进行什么比较,只是它不是指针。我认为那些是函数指针,而不仅仅是保存返回的int* haha​​ 的指针。无论如何,我已经编辑删除了关于函数相等比较的随机废话。要点仍然是正确的......值是相等的,因为他取消了引用。
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2012-07-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多