Go语言函数参数为什么会被修改_Golang指针参数作用机制说明
发布时间 - 2026-01-29 00:00:00 点击率:次因为Go默认值传递,参数是副本,修改不影响原变量;传指针则通过地址操作原始内存。值传递适合小数据只读,指针传递仅当需修改原始变量时使用。
为什么传指针才能修改函数外的变量?
因为 Go 默认是值传递:每次调用函数时,参数会被完整复制一份,函数里改的是副本,不影响原始变量。 updateValue(x) 里的 x 和外面的 num 是两块内存,改 x 没用;但 updateValue(&num) 传的是地址,*x 实际是在操作 
num 所在的那块内存。
- 值传递:适合只读小数据(如
int、bool),语义清晰、线程安全 - 指针传递:仅当你**明确需要写入原始变量**时才用,不是“更高级”而是“有目的”
- 常见错觉:以为
func f(p *int) { p = &someLocal }能改变调用方的指针指向——不能,p本身仍是值传递,只能改它指向的值,不能改它自己存的地址
结构体传参不加 * 会悄悄拖慢程序
结构体哪怕只有两个字段,只要尺寸超过机器字长(通常 8 字节),Go 编译器就可能把它整个拷贝进栈;而一个 *Person 永远只占 8 字节(64 位系统)。对大结构体(比如含切片、数组或嵌套结构),值传递会触发大量内存分配和拷贝。
- 实测对比:
type Big struct{ data [10000]int },传值比传指针慢 3–5 倍,GC 压力明显升高 - 接口方法接收者也遵循同样逻辑:如果方法要修改结构体字段,接收者必须是
*T;否则编译报错cannot assign to s.Name (s is not addressable) - 切片、map、channel 本身已含指针(底层是结构体),传值不会复制底层数组,所以一般不用额外加
*
new() 和 & 都能得指针,但用途完全不同
new(T) 返回一个指向新分配的零值 T 的指针,适用于基本类型或简单结构体初始化;&v 是取已有变量地址,适用于你已有实例、只想共享或修改它。
-
p := new(int)→*int,值为0,等价于var tmp int; p := &tmp -
v := 42; p := &v→*int,值为42,且后续改*p就是改v - 别混用:
new([]int)得到的是*[]int(指向 nil 切片的指针),不是你想要的可 append 的切片;该用make([]int, 0)
并发场景下指针不是万能解药
多个 goroutine 共享同一指针指向的数据,不代表线程安全。没有同步机制时,ptr.Age++ 这种操作仍可能丢失更新(非原子)。
- 指针只是让多个 goroutine 访问同一块内存,但读写冲突需靠
sync.Mutex、atomic或 channel 协调 - 误以为“用了指针=自动线程安全”,结果跑一段时间出现随机数据错乱,这种 bug 极难复现
- 更推荐:优先用 channel 传递所有权,减少裸指针共享;实在要共享,把锁封装进结构体方法里
# go
# golang
# go语言
# app
# 字节
# 栈
# 作用域
# 同步机制
# 为什么
# golang指针
# 封装
# 局部变量
# 结构体
# bool
# int
# 指针
# 接口
# 堆
# Struct
# 线程
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速搭建安全的FTP站点?
nodejs redis 发布订阅机制封装实现方法及实例代码
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
php结合redis实现高并发下的抢购、秒杀功能的实例
Java解压缩zip - 解压缩多个文件或文件夹实例
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
php json中文编码为null的解决办法
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
如何用JavaScript实现文本编辑器_光标和选区怎么处理
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
Laravel如何使用Blade组件和插槽?(Component代码示例)
如何彻底卸载建站之星软件?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
在线制作视频的网站有哪些,电脑如何制作视频短片?
JavaScript常见的五种数组去重的方式
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
Python文本处理实践_日志清洗解析【指导】
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
英语简历制作免费网站推荐,如何将简历翻译成英文?
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
Linux系统命令中screen命令详解
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
北京专业网站制作设计师招聘,北京白云观官方网站?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
如何在阿里云通过域名搭建网站?
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
怎么用AI帮你为初创公司进行市场定位分析?
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
高性价比服务器租赁——企业级配置与24小时运维服务
Laravel如何使用withoutEvents方法临时禁用模型事件
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
如何挑选最适合建站的高性能VPS主机?
如何实现javascript表单验证_正则表达式有哪些实用技巧
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
bootstrap日历插件datetimepicker使用方法
网站制作免费,什么网站能看正片电影?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?

