package main import ( "fmt" ) type Numbers struct { x int y int } func initial(number *Numbers) { number.x = 1 number.y = 1 } func final(number *Numbers) { number = &Numbers{2, 2} } func main() { p := Numbers{0, 0} fmt.Println(p) //Prints {0 0} initial(&p) fmt.Println(p) //Prints {1 1} final(&p) fmt.Println(p) //Expected to print {2, 2} but prints {1, 1} }
为什么 initial 函数修改指针,而 final 函数修改指针的副本?
initial和final的函数参数都指向p在main中的内存地址; initial 能够更改 p,而 final 则不能。
任何解释为什么会出现这种情况,我们将不胜感激。
要修改指针指向的数据,必须取消引用该指针。解引用运算符是 *。然而,为了方便使用,Go 在某些情况下会隐式插入解引用操作。例如,number.x = 1 被转换为 (*number).x = 1。
这种隐式翻译可能会令人困惑,但您应该看到,如果翻译没有发生,那么表达式 number.x = 1 将毫无意义,因为 number 是指针类型,并且指针没有字段。
综上所述,initial 函数具有隐式指针解引用,而 final 则没有。
如果您将 final 更改为显式且正确地取消引用,*number = Numbers{2, 2},那么它也会更改 p。
以上就是如何确定作为函数参数传递的指针是否正在被修改,或者副本是否正在被修改?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号