指针理解

时间:2019-06-18 23:54:18

标签: pointers go

我具有结构类型和变量的引用地址,但是它不能反映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.   
  3. 为什么defer函数不能反映'xp2'变量的最新值?
  4.   

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

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

输出为

Pointer-Closing Pointer-X2 Second

1 个答案:

答案 0 :(得分:2)

  
      
  1. 为什么它在实际输出中显示为“&”,并显示要打印变量的地址
  2.   

在此处查看格式选项:

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

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

fmt.Printf("Pointer-Closing %p\n", xp2)
  
      
  1. 为什么defer函数不能反映'xp2'变量的最新值?
  2.   

在这里看看:

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

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

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