困惑的高级指针谜题
问题:
在以下 go 代码中,两个函数都接受指针作为参数,但只有 modifypointer 成功修改了原始值。解释它们用法上的差异,并说明原因。
package main type point struct { x int y int } func (p point) string() string { return fmt.sprintf("(%d, %d)", p.x, p.y) } func modifypointer(point *point) { point.x = 5 point.y = 5 } func modifyreference(point *point) { point = &point{5, 5} } func main() { p := point{0, 0} fmt.println(p) // prints (0, 0) modifypointer(&p) fmt.println(p) // prints (5, 5) p = point{0, 0} modifyreference(&p) fmt.println(p) // prints (0, 0) 困惑在这里,我期待的是(5, 5) }
登录后复制
答案:
当函数对指针执行操作时,实际操作的不是原始值,而是指针指向的值。modifypointer 操作的是 point.x 和 point.y 的值,这些值是 p 类型的属性。point.x 和 point.y 指向 p 的存储位置,因此对它们进行修改会更新原始值。
然而,modifyreference 操作的是指针 point 本身,它将 point 重定向到一个新分配的值。由于传递给 modifyreference 的 point 是指针的副本,因此修改它不会影响外部值 p。
要使用 modifyreference 修改原始值,可以使用 point 访问指针指向的值。修改 point 的值会影响原始值,因为 *point 等于 p。
修改后的 modifyreference 代码:
func modifyReference(point *Point) { *point = Point{5, 5} }
登录后复制
以上就是Go 指针函数:为何 modifyPointer 修改了原始值,而 modifyReference 没有?的详细内容,更多请关注抖狐科技其它相关文章!
-
主流编程语言有哪些
主流编程语言包括:python:高层次解释型语言,用于数据科学和web开发。java:面向对象的跨平台语言,用于企业级应用程序和android开发。c++:功能强大的系统编程语言,用于操作系统和高性能...
-
苹果手机传感器一闪一闪
苹果手机传感器闪烁可能是由接近感测器、光线感测器、红外线探测器或软件故障导致的。建议:1. 清理传感器区域;2. 关闭相关设置;3. 重启手机;4. 重置面部 id;5. 更新软件;若以上方法无效,可...
-
物华弥新1.4下角色梯度配队分析
更新后角色强度变化随着物华弥新1.4下版本更新,游戏迎来了众多新角色登场以及老角色调整。这些变动势必对角色强度榜造成影响。新角色强势加盟本次更新中,多位新角色强势加盟游戏,他们的独特技能和属性为阵容带...
-
如何检验dos命令是否正常
以下方法可检验 dos 命令是否正常:1. 打开命令提示符或终端窗口;2. 输入要检验的 dos 命令;3. 检查命令输出是否符合预期;4. 检查错误消息以了解问题;5. 尝试使用替代命令。如何检验...
-
Java函数式接口在并行编程中的实战
Java 函数式接口在并行编程中的实战 Java 中的函数式接口为并行编程提供了强大的工具。通过将复杂任务分解成较小的、可并行执行的部分,我们可以在多核系统中显著提高代码效率。 函数式接口 函数式接口...