pointers - 指针理解
问题描述
我有变量的结构类型和引用地址,但它不反映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
我的问题是:
- 为什么它在实际输出中显示为“&”,它假设打印变量的地址。
- 为什么延迟函数没有反映“xp2”变量的最新值?
所以对于第2 点- 我已经实现了以下功能。有人可以告诉我这是解决此问题的最佳方法。
func main() {
xp2 := XY{"Pointer-X2 First"}
defer CloseP( &xp2 )
xp2 = XY{"Pointer-X2 Second"}
}
输出是
Pointer-Closing Pointer-X2 Second
解决方案
- 为什么它在实际输出中显示为'&',它假设打印变量的地址
看看这里的格式选项:
Println
使用默认值%v
,如果要打印指针的值,可以使用%p
格式,如下所示:
fmt.Printf("Pointer-Closing %p\n", xp2)
- 为什么延迟函数没有反映“xp2”变量的最新值?
看看这里:
https://blog.golang.org/defer-panic-and-recover
A deferred function's arguments are evaluated when the defer statement is evaluated.
因此,在defer
此处评估时,指针正在引用第一个对象,因此输出符合预期。
推荐阅读
- javascript - 为什么从状态单击按钮时不显示更新值?
- javascript - 用于从字段中删除字符的简单 Javascript 代码
- google-sheets - 如何根据条件过滤掉数据
- f# - 从 Fable.Remoting 返回异步值
- swift - 如何在 macOS 应用程序中使用 CALayer 在 AVPlayerView 顶部添加图像?
- c# - 使用 ForEach 迭代 Checkbox 属性而不使用 LINQ
- html - 如何使用多个字体覆盖 bootstrap 4 默认字体?
- ruby - 为什么 concat 和 << 在分配时不会更改字符串变量
- python - 从一个数据集创建一个 2x2 子图作为不同的图
- javascript - 显示来自 ajax 的图像 src