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

Golang方法值接收者和指针接收者区别_Golang方法接收者教程【实战】

因为用了值接收者,方法操作的是结构体副本,修改不反映到原变量;需改用指针接收者(*User)才能修改原值,且接口实现要求接收者类型一致。为什么 SetName 调用后原结构体没变?因为用了值接收者 —— 方法内部操作的是结构体副本,改完就销毁,原始变量纹丝不动。现象:func (u User) SetName(name string) 中写 u.Name = name,调用后 u.Name 还是老值原因:Go 每次调用都复制整个 User,字段修改只发生在栈上临时副本里修复:改成 func (u *User) SetName(name string),u 指向原内存地址,u.Name = name 真生效注意:User{Name: "A"} 是不可寻址字面量,连 & 都取不了,根本没法调指针接收者方法接口报错 User does not implement Namer 怎么办?不是代码写错了,是接收者类型和接口要求不匹配 —— 接口方法定义在 *User 上,你却传了 User{} 值。规则:type User 的方法集只包含值接收者方法;*User 的方法集才包含所有方法(值 + 指针)常见场景:func (u *User) GetName() string 实现了接口,那只有 &User{} 能赋值给该接口变量,User{} 不行实操建议:如果结构体已有任意一个指针接收者方法,其余方法最好统一用指针接收者,避免接口实现断层小结构体该用值接收者还是指针接收者?≤24 字节且无指针字段的小结构体(如 type Point struct{X,Y int}),值接收者更安全、更快。性能:复制几个整数比传一个指针还轻量,没有 cache miss 风险语义清晰:func (p Point) Distance() 表达“计算派生值”,天然不可变,调用方无需担心副作用反例:含 []byte、map、大数组或嵌套指针的结构体,哪怕字段少,也建议用指针接收者 —— 切片头、map header 本身虽小,但背后数据可能巨大为什么 c.Inc() 能直接调用,明明 Inc 是指针接收者?Go 编译器自动帮你加了 & —— 但这是语法糖,底层逻辑没变:只有指针才能改原值。立即学习“go语言免费学习笔记(深入)”;机制:c := Counter{} 是可寻址变量,c.Inc() 等价于 (&c).Inc()陷阱:如果 c 是函数返回的临时值(如 makeCounter().Inc()),或字面量(如 Counter{}.Inc()),就会报错 cannot call pointer method on Counter literal关键点:自动取址只解决“能不能调”,不解决“改不改得动”——只要接收者是 *T,它就一定在修改原始对象最常被忽略的其实是“一致性”:一旦某个方法因需修改字段用了指针接收者,其他方法再用值接收者,不仅接口可能失效,还会让调用方困惑——同一个结构体,有的方法改状态,有的不改,边界模糊。真要混用,得有非常明确的理由。

http://www.jsqmd.com/news/630710/

相关文章:

  • 3分钟掌握D2RML:暗黑2重制版终极多开解决方案
  • 告别烧录器!手把手教你用S32K144和CAN总线实现汽车ECU远程刷写(附完整代码)
  • 【实战指南】巧用分区助手,无损扩容C盘,告别存储焦虑
  • Linux核心虚拟文件系统完整技术分析
  • 数据团队该醒醒了:AI智能体不是你的下一个仪表盘矣
  • 告别简单池化:用PyTorch实现Attention MIL,让模型学会‘聚焦’关键实例
  • 大模型上线不再踩雷:3步灰度验证法+7类关键指标监控体系(附SOP模板)
  • 魔百盒CM211-1-ZG免拆机刷机指南:当贝桌面优化与三网解锁全攻略
  • Dify与扣子智能体平台:从零到一构建AI应用的实战路径解析
  • YOLO-Master 与 YOLO 开始豢
  • 如何快速掌握XXMI启动器:新手完整的游戏模组管理指南
  • 南大ICS2021课程实践:从零实现vsnprintf库函数
  • GoCodingInMyWay讣
  • DIY智能空气检测仪:用Arduino+ESP8266+KQM6600模块搭建低成本方案
  • 8bit逐次逼近型SAR ADC电路设计成品 入门时期的第三款sarADC,适合新手学习等
  • 用Python搞定复合材料层合板ABD矩阵:从单层板属性到完整刚度计算(附代码避坑)
  • 多目标跟踪MOT避坑指南:从SORT到OC-SORT,如何解决卡尔曼滤波的误差累积与非线性运动问题
  • 光猫‘桥接’vs‘路由’模式到底选哪个?实测对比网速、NAT和游戏延迟,手把手教你改配置
  • .Acwing基础课第题-简单-区间和掌
  • DG储能选址定容模型中的Matlab改进粒子群算法程序
  • 2026年4月挖掘机半轴实力厂家哪个好,商用车半轴/挖掘机半轴/汽车半轴/工程车半轴/汽车后桥半轴,挖掘机半轴公司推荐 - 品牌推荐师
  • 3D高斯泼溅(3DGS)可视化工具SIBR Core:从源码到EXE,我的Windows 10环境配置全记录
  • 智慧数字乡村农业大数据平台解决方案:构建了管理、生产、服务、决策、经营五大平台、N个支撑子系统、大数据展示
  • 别再死记硬背MVVM了!用Vue.js和React Hooks手把手带你拆解‘服务员’ViewModel
  • LinkSwift网盘直链下载助手:八大网盘一键获取真实下载地址
  • 别再只盯着DeepFM了!用AutoInt+Transformer搞定CTR预估中的高阶特征交叉(附PyTorch代码)
  • 痞子衡嵌入式:turbo-spiboot - 一种基于MCUBoot协议的二级SPI加载APP提速方案镣
  • CSS如何优雅地重用UI代码片段_通过BEM命名规范抽取公共模块
  • 如何彻底清理Windows系统垃圾?开源工具Win11Debloat完整指南
  • [AI应用框架/Java] Spring AI 应用开发指南<>概述、快速入门槐