首页 > 解决方案 > 指针理解

问题描述

我有变量的结构类型和引用地址,但它不反映defer函数中变量的最新值。

type XY struct {
    S string
}

func CloseP(x *XY) {
    if x != nil {
        fmt.Println("Pointer-Closing", x.S)
    }
}

func main() {

    xp2 := &XY{"Pointer-X2 First"}
    fmt.Println(xp2)
    defer CloseP( xp2  )
    xp2 = &XY{"Pointer-X2 Second"}
    fmt.Println(xp2)

}

Output

&{Pointer-X2 First}
&{Pointer-X2 Second}
Pointer-Closing Pointer-X2 First

预期产出

0xc000086018
0xc000086018
Pointer-Closing Pointer-X2 Second

我的问题是:

  1. 为什么它在实际输出中显示为“&”,它假设打印变量的地址。
  2. 为什么延迟函数没有反映“xp2”变量的最新值?

所以对于第2 点- 我已经实现了以下功能。有人可以告诉我这是解决此问题的最佳方法。

func main() {
    xp2 := XY{"Pointer-X2 First"}
    defer CloseP( &xp2  )
    xp2 = XY{"Pointer-X2 Second"}
}

输出是

Pointer-Closing Pointer-X2 Second

标签: pointersgo

解决方案


  1. 为什么它在实际输出中显示为'&',它假设打印变量的地址

看看这里的格式选项:

https://golang.org/pkg/fmt/

Println使用默认值%v,如果要打印指针的值,可以使用%p格式,如下所示:

fmt.Printf("Pointer-Closing %p\n", xp2)
  1. 为什么延迟函数没有反映“xp2”变量的最新值?

看看这里:

https://blog.golang.org/defer-panic-and-recover

A deferred function's arguments are evaluated when the defer statement is evaluated.

因此,在defer此处评估时,指针正在引用第一个对象,因此输出符合预期。


推荐阅读