技术文摘
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 代码。
- MySQL 中 count() 查询的性能剖析
- SQL Server 中日期时间与字符串的转换实例
- MySQL 自动安装脚本代码实例展示
- SQL Server 实例间登录名和密码传输的详细步骤
- Mysql 单表访问方法的图文详细示例
- Mysql 子查询的三个应用场景解析
- MySQL 中常用查看锁与事务的 SQL 语句剖析
- SQL 语句查找重复数据(最新推荐)
- Windows11 安装 SQL Server 2016 数据库报错“等待数据库引擎恢复句柄失败”的解决办法
- SQL Server 中去除数据里无用空格的方法
- Mysql 中 Union 的运用——多表行合并
- Sql 数据库中去除字段所有空格小结
- MySQL 数据导出为 sql 文件的最优实践
- Mysql 中 json 数据类型查询操作指引
- SQL Server 中.mdf 导入方法的错误处置策略