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

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 语言(指针传递)
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 语言(引用传递)
php 复制代码
function modify(&$data) {
    // 直接重新赋值,外部会受影响(因为是引用传递)
    $data = ['value' => 200];
}

$d = ['value' => 100];
modify($d);
echo $d['value']; // 输出 200(引用传递导致外部变量被修改)

总结

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

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

相关推荐
molong93127 分钟前
Android 应用配置跳转微信小程序
android·微信小程序·小程序
2501_9151063237 分钟前
iOS 可分发是已经上架了吗?深入解析应用分发状态、ipa 文件上传、TestFlight 测试与 App Store 审核流程
android·ios·小程序·https·uni-app·iphone·webview
会跑的葫芦怪2 小时前
Go语言net/http库使用详解
http·golang·iphone
catchadmin3 小时前
PHP 快速集成 ChatGPT 用 AI 让你的应用更聪明
人工智能·后端·chatgpt·php
安东尼肉店9 小时前
Android compose屏幕适配终极解决方案
android
2501_916007479 小时前
HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包)
android·ios·小程序·https·uni-app·iphone·webview
Q_Q5110082859 小时前
python+django/flask+uniapp基于微信小程序的瑜伽体验课预约系统
spring boot·python·django·flask·uni-app·node.js·php
2503_9248068510 小时前
动态IP使用中 报错407 怎么办???
服务器·tcp/ip·php
feiyangqingyun10 小时前
基于Qt和FFmpeg的安卓监控模拟器/手机摄像头模拟成onvif和28181设备
android·qt·ffmpeg
数据知道11 小时前
Go基础:Go语言能用到的常用时间处理
开发语言·后端·golang·go语言