当前位置: 首页 > backend >正文

深入理解Go 与 PHP 在参数传递上的核心区别

$run_return_data = [];
$ret = $this->handleData($event_req_info, $run_return_data);
public function handleData($event_req_info, &$run_return_data): array
{$run_return_data = [ //使用引用变量返回数据'shop_id'      => $shop_id,'request_id'   => $request_id,];
}

在你的 PHP 代码中,能够在调用方获取到 $run_return_data 的值,是因为你在函数参数中使用了 引用传递(&$run_return_data。这种行为与 Go 语言的指针传递有本质区别,主要源于两种语言在参数传递机制上的设计差异。

为什么 PHP 中能获取到修改后的值?

PHP 中,函数参数默认是 值传递(即传递变量的副本),但通过在参数前添加 & 符号,可以显式指定为 引用传递。此时:

  • 函数内部对 $run_return_data 的修改(包括直接赋值一个新数组),本质上是对 原变量内存地址的内容 进行修改。
  • 调用方的 $run_return_data 与函数内部的 $run_return_data 指向 同一块内存,因此修改会直接反映到外部。

你的代码中,handleData 方法通过 &$run_return_data 声明了引用传递,所以内部对 $run_return_data 的重新赋值($run_return_data = [...])会直接改变外部变量的值。

Go 与 PHP 在参数传递上的核心区别

特性Go 语言PHP 语言
默认传递方式所有参数均为 值传递(包括指针本身也是值传递)。默认是 值传递,但可通过 & 显式指定引用传递。
指针/引用的含义指针是一个存储内存地址的变量(类似“地址标签”)。
函数接收指针时,接收的是指针的 副本(仍指向原数据)。
引用是变量的“别名”,与原变量共享同一块内存。
函数接收引用时,直接操作原变量的内存。
对参数重新赋值的影响若在函数内对指针参数 重新赋值(如 p = &newObj),只会修改指针副本的指向,不影响外部原始指针。
只有修改指针 指向的内容(如 p.Field = 123),才会影响外部。
若通过引用传递(&param),函数内对参数 重新赋值(如 $param = [...]),会直接修改外部变量的值。

举例对比

1. Go 语言(指针传递)
type Data struct {Value int
}func modify(p *Data) {// 错误:重新赋值指针副本,外部不受影响p = &Data{Value: 200}// 正确:修改指针指向的内容,外部会受影响// p.Value = 200
}func main() {d := &Data{Value: 100}modify(d)fmt.Println(d.Value) // 输出 100(因为函数内是重新赋值指针副本)
}
2. PHP 语言(引用传递)
function modify(&$data) {// 直接重新赋值,外部会受影响(因为是引用传递)$data = ['value' => 200];
}$d = ['value' => 100];
modify($d);
echo $d['value']; // 输出 200(引用传递导致外部变量被修改)

总结

  • PHP 的引用传递 更接近“变量别名”,函数内对参数的任何修改(包括重新赋值)都会直接影响外部。
  • Go 的指针传递 本质是“地址的副本”,只有修改指针指向的内容(而非指针本身),才会影响外部。

这就是为什么你在 PHP 中通过引用传递能获取到修改后的值,而 Go 中若错误地对指针本身重新赋值则无法生效。

http://www.xdnf.cn/news/19087.html

相关文章:

  • 领域知识如何注入LLM-检索增强生成
  • Java 学习笔记(基础篇11)
  • ExcelJS实现导入转换HTML展示(附源码可直接使用)
  • JavaScript 基础核心知识点总结:从使用方式到核心语法
  • RAG 系统核心:深入理解向量相似度匹配与文本向量化
  • Springboot高校迎新系统2cbcd(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 【原创】MiniCPM-V 4.5模型测试 pk gemini2.5pro 本地8G显卡
  • 第四章 Vue3 + Three.js 实战:GLTF 模型加载与交互完整方案
  • @Gitea 介绍部署使用详细指南
  • 【二叉树(DFS)- LeetCode】124. 二叉树中的最大路径和
  • 3 反向传播
  • WebStorm-在WebStorm中使用Git管理项目
  • Set和Map
  • Manus AI:突破多语言手写识别的技术壁垒,重塑全球交流方式
  • 【69页PPT】智慧方案智慧校园解决方案(附下载方式)
  • oceanbase-参数及变量的记录
  • 零成本解锁 Cursor Pro:虚拟卡白嫖1个月+14天试用全攻略
  • 【MFC自动生成的文件详解:YoloClassMFC.cpp 的逐行解释、作用及是否能删除】
  • 30分钟入门实战速成Cursor IDE(2)
  • B树的概述以及插入逻辑
  • 亚马逊的宝藏促销活动~
  • Java全栈开发实战:从基础到微服务的深度探索
  • KNN算法详解:鸢尾花识别和手写数字识别
  • 在做题中学习(91):二叉树的锯齿形层序遍历
  • Vue3 中的 v-model 语法糖
  • 什么是token,什么叫词嵌入
  • linux系统学习(9.文件系统管理)
  • Linux Shell 编程
  • Less介绍Less变量
  • C/C++ 编程实战 -- CMake用法