首页 > 后端开发 > Golang > 正文

Golang如何使用指针接收者定义方法

P粉602998670
发布: 2025-10-25 14:35:02
原创
684人浏览过
指针接收者是指方法接收者为指向结构体的指针,语法为func (r *Type) MethodName(),可修改原对象字段并避免复制大对象提升性能。使用指针接收者能让方法如SetName直接修改原始值,而值接收者仅操作副本,无法改变原对象。例如person.SetName("Bob")能生效是因为指针接收者操作的是原始实例;若用值接收者ChangeName则不会改变原Name。建议在需修改状态、结构体较大或保持方法一致性时使用指针接收者,小结构体或只读操作可用值接收者。Go官方建议不确定时优先选择指针接收者。

golang如何使用指针接收者定义方法

在Go语言中,使用指针接收者定义方法可以让方法修改接收者指向的值,同时避免复制大对象,提高性能。当你希望方法能改变结构体实例的状态时,通常会使用指针接收者。

什么是指针接收者

指针接收者是指在定义方法时,接收者是一个指向结构体类型的指针。语法形式为 func (r *Type) MethodName(),其中 * 表示接收者是指针类型。

例如:

type Person struct {<br>    Name string<br>    Age  int<br>}<br><br>// 使用指针接收者定义方法<br>func (p *Person) SetName(name string) {<br>    p.Name = name<br>}
登录后复制

立即学习go语言免费学习笔记(深入)”;

调用该方法时,即使你传入的是变量本身,Go会自动处理取地址操作:

person := Person{Name: "Alice", Age: 25}<br>person.SetName("Bob") // Go 自动转换为 &person 调用
登录后复制

为什么使用指针接收者

使用指针接收者主要有两个原因:

  • 修改接收者字段:值接收者只能操作副本,无法真正修改原对象;指针接收者可以直接修改原始数据。
  • 提升性能:对于较大的结构体,每次方法调用都会复制整个对象。使用指针接收者可以避免这种开销。

比如这个例子中,如果不使用指针接收者,Age字段不会被真正修改:

知我AI
知我AI

一款多端AI知识助理,通过一键生成播客/视频/文档/网页文章摘要、思维导图,提高个人知识获取效率;自动存储知识,通过与知识库聊天,提高知识利用效率。

知我AI 101
查看详情 知我AI

func (p *Person) GrowOneYear() {<br>    p.Age++<br>}
登录后复制

值接收者 vs 指针接收者

以下对比说明两者的差异:

// 值接收者:接收的是副本<br>func (p Person) ChangeName(name string) {<br>    p.Name = name // 只修改副本<br>}<br><br>// 指针接收者:直接操作原对象<br>func (p *Person) SetName(name string) {<br>    p.Name = name // 修改原始对象<br>}
登录后复制

调用结果:

person := Person{"Tom", 30}<br>person.ChangeName("Jerry") // Name 不变<br>fmt.Println(person.Name)  // 输出 Tom<br><br>person.SetName("Jerry")   // Name 被修改<br>fmt.Println(person.Name)  // 输出 Jerry
登录后复制

何时使用指针接收者

建议在以下情况使用指针接收者:

  • 方法需要修改接收者的字段
  • 结构体较大(如包含多个字段或数组)
  • 保持与同类型其他方法一致性(如果部分方法用了指针接收者,其余也建议统一)

小结构体或只读操作可使用值接收者。Go官方提倡:不确定时优先考虑指针接收者,尤其是要修改状态时。

基本上就这些。指针接收者是Go中常见的模式,理解它有助于写出更高效、可维护的代码。

以上就是Golang如何使用指针接收者定义方法的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号