我具有结构类型和变量的引用地址,但是它不能反映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
我的问题是:
- 为什么在实际输出中显示为“&”,并假定在此显示变量的地址。
- 为什么defer函数不能反映'xp2'变量的最新值?
因此对于第2点-我实现了以下功能。有人可以告诉我这是解决此问题的最佳方法。
func main() {
xp2 := XY{"Pointer-X2 First"}
defer CloseP( &xp2 )
xp2 = XY{"Pointer-X2 Second"}
}
输出为
Pointer-Closing Pointer-X2 Second
答案 0 :(得分:2)
- 为什么它在实际输出中显示为“&”,并显示要打印变量的地址
在此处查看格式选项:
Println
使用默认的%v
,如果要打印指针的值,可以使用%p
格式,如下所示:
fmt.Printf("Pointer-Closing %p\n", xp2)
- 为什么defer函数不能反映'xp2'变量的最新值?
在这里看看:
https://blog.golang.org/defer-panic-and-recover
A deferred function's arguments are evaluated when the defer statement is evaluated.
因此,在此处评估defer
时,指针正在引用第一个对象,因此输出是预期的。