技术文摘
Go 代码中传递指针后,为何修改函数内局部变量无法改变指针值
在 Go 语言编程中,指针的运用十分常见,但不少开发者会遇到这样的困惑:传递指针后,在函数内修改局部变量却无法改变指针值。要理解这一现象,我们需深入探究 Go 语言的内存模型与参数传递机制。
Go 语言在函数调用时,参数传递采用值传递的方式。这意味着当我们将一个指针作为参数传递给函数时,实际上传递的是该指针的副本,而非指针本身。尽管指针副本和原始指针指向同一块内存地址,但它们是两个独立的变量。
举个简单的例子,假设有一个结构体 Person,包含 Name 和 Age 字段。当我们编写函数来尝试修改指针值时,如 func changePointer(ptr *Person),在函数内部对 ptr 进行重新赋值,比如 ptr = &Person{},此时修改的仅仅是函数内指针副本的值,原始指针的值并未受到影响。因为原始指针在函数调用时被复制了一份传递进去,函数内对副本的操作与原始指针没有直接关联。
若想在函数内真正改变指针的值,一种方法是传递指针的指针。例如 func changeRealPointer(ptr **Person),这样在函数内部对 *ptr 进行赋值操作,就能够修改原始指针的值。这是因为此时传递的是指针的指针,函数内的操作直接作用于指向原始指针的那个指针上。
我们要区分修改指针所指向的值和修改指针本身这两个概念。如果只是想修改指针所指向的结构体内部的字段值,那么直接使用传递进来的指针即可,如 ptr.Name = "New Name",这种操作会直接反映在原始结构体上,因为指针副本和原始指针指向同一块内存区域。
在 Go 代码中传递指针后修改函数内局部变量无法改变指针值,本质是由于值传递机制产生的指针副本导致的。理解这一原理,能帮助我们更准确地运用指针,编写出高效且正确的 Go 代码。
- Docker 中 MongoDB(mongo.latest)的安装流程
- docker-compose 不停机部署与灰度发布的四种途径
- Mac 安装 Docker 全程轻松搞定
- Docker 启动 gitlab 后 22 端口占用的解决办法
- 常见的 Dockerfile 精简规则总结
- Dockerfile 构建自定义镜像的操作流程
- Docker 助力 HertzBeat 实时监控告警系统部署
- Docker 实现 Zookeeper 分布式协调器的部署
- Dockerfile 与 docker-compose 详细使用指南
- Docker 中 namespace 隔离的实践
- Docker 可视化面板 Portainer 的达成
- Docker-compose 详解与 LNMP 搭建全流程
- Docker 终端无法输入中文的问题与解决之道
- 在 Docker 容器中添加自定义 MySQL 配置文件
- Docker 搭建开源翻译组件 Deepl 超详细教程(必收藏)