Golang如何定义方法_结构体方法与接收者解析
发布时间 - 2026-01-25 00:00:00 点击率:次Go结构体方法必须绑定命名类型,未命名类型不可定义方法;需修改字段时必须用指针接收者;嵌套结构体不继承方法,仅匿名字段可提升方法且要求可寻址。
结构体方法必须绑定到命名类型
Go 不允许直接为未命名类型(比如 struct{} 或 []int)定义方法。你得先用 type 声明一个新名字,再为它加方法。
常见错误是写成这样:
func (s struct{ Name string }) GetName() string {
return s.Name
}
编译会报错:invalid receiver type struct{ Name string }。正确做法是:
- 先定义命名类型:
type Person struct{ Name string } - 再为
Person定义方法,接收者可以是Person或*Person
值接收者 vs 指针接收者:什么时候必须用指针
如果方法需要修改结构体字段,接收者必须是指针类型;否则修改只作用于副本,原值不变。
另外,只要结构体任一方法用了指针接收者,那么调用该方法时传入的变量也应尽量保持一致性——尤其是接口实现时,*T 和 T 的方法集不同。
-
T的方法集:所有值接收者方法 -
*T的方法集:所有值接收者 + 所有指针接收者方法 - 所以实现了某个接口的往往是
*T,而不是T
示例:
type Counter struct{ n int }
func (c Counter) Inc() { c.n++ } // 值接收者 → 不改变原结构体
func (c *Counter) IncPtr() { c.n++ } // 指针接收者 → 修改生效
接收者命名惯例与可读性
接收者名字不是关键字,但社区约定用简短、有意义的小写字母,如 c 表示 Counter,s 表示 Stringer,r 表示 Reader。避免用 self 或 this ——这不是 Go 风格。
更重要的是别用大写首字母(如 Self),否则可能被误认为导出标识符;也别用下划线 _,除非你真不需要它(比如空实现)。
- 推荐:
func (p *Person) GetName() string - 不推荐:
func (Self *Person) GetName() string - 更不推荐:
func (_ *Person) GetName() string(除非你明确不访问字段)
嵌套结构体不会自动继承方法
Go 没有继承概念,即使结构体字段是另一个结构体类型,也不会“继承”其方法。匿名字段提供的是组合(composition)和方法提升(method promotion),但有严格限制:
- 只有当嵌入字段是**命名类型**且**未被遮蔽**时,其方法才被提升到外层结构体
- 如果外层结构体自己定义了同名方法,就会覆盖嵌入字段的方法
- 嵌入字段的方法接收者类型仍保持原样:若它是
*Embedded方法,则调用时外层必须是可寻址的(即不能是字面量或临时值)
例如:
type User struct{ Name string }
func (u *User) Greet() string { return "Hi, " + u.Name }
type Admin struct{ User } // 匿名嵌入
// 此时 Admin{} 不能直接调用 Greet(),因为 Greet 接收者是 *User
// 必须用 &Admin{}.Greet() 或声明变量后取地址
最容易忽略的一点:方法提升不跨指针层级。嵌入的是 User,但 User 的指针

Admin 的值实例调用成功。
# go
# golang
# String
# 标识符
# 结构体
# int
# 指针
# 继承
# 接口
# 指针类型
# Struct
# this
# 的是
# 绑定
# 再为
# 就会
# 未命名
# 尤其是
# 不需要
# 什么时候
# 下划线
# 它是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
昵图网官方站入口 昵图网素材图库官网入口
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
三星、SK海力士获美批准:可向中国出口芯片制造设备
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
高端建站如何打造兼具美学与转化的品牌官网?
C++时间戳转换成日期时间的步骤和示例代码
智能起名网站制作软件有哪些,制作logo的软件?
python中快速进行多个字符替换的方法小结
如何快速建站并高效导出源代码?
EditPlus 正则表达式 实战(3)
如何在阿里云虚拟服务器快速搭建网站?
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
,网页ppt怎么弄成自己的ppt?
JS实现鼠标移上去显示图片或微信二维码
JavaScript中的标签模板是什么_它如何扩展字符串功能
Python文件流缓冲机制_IO性能解析【教程】
如何快速生成专业多端适配建站电话?
详解Android——蓝牙技术 带你实现终端间数据传输
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
Laravel storage目录权限问题_Laravel文件写入权限设置
如何在宝塔面板中修改默认建站目录?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
如何在万网自助建站平台快速创建网站?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
微信小程序 五星评分(包括半颗星评分)实例代码
如何在Windows服务器上快速搭建网站?
如何在IIS中新建站点并解决端口绑定冲突?
Laravel如何使用Sanctum进行API认证?(SPA实战)
历史网站制作软件,华为如何找回被删除的网站?
如何用搬瓦工VPS快速搭建个人网站?
详解Huffman编码算法之Java实现
Bootstrap CSS布局之列表
再谈Python中的字符串与字符编码(推荐)
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
如何获取PHP WAP自助建站系统源码?
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
长沙企业网站制作哪家好,长沙水业集团官方网站?
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
Java解压缩zip - 解压缩多个文件或文件夹实例
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
如何在橙子建站中快速调整背景颜色?
装修招标网站设计制作流程,装修招标流程?
Laravel Session怎么存储_Laravel Session驱动配置详解
上一篇:git上传文件怎么传
下一篇:git代码冲突怎么处理
上一篇:git上传文件怎么传
下一篇:git代码冲突怎么处理

