07 | 函数与方法:理解Go面向对象的不同方式,何时选择其一?
Tony Bai

你好,我是 Tony Bai。
经过前面几讲对 Go 数据类型的强化学习,我们现在转向探讨类型的“行为”部分。在 Go 语言中,封装和复用代码的主要手段就是函数(function)和方法(method)。
你可能已经注意到,Go 中的函数和方法在形式上非常相似,甚至可以说,Go 在设计时有意模糊了两者的界限。这并非疏忽,而是一种深思熟虑的选择,旨在:
简化类型系统。
提供更大的灵活性。
鼓励使用组合而非继承来实现代码复用和多态。
这与 Go 整体简洁、正交的设计哲学一脉相承。
但这种相似性也可能带来困惑:它们到底有什么本质区别?仅仅是语法上多了一个“接收者”吗?在实际开发中,我应该将一段逻辑实现为函数,还是某个类型的方法?错误的选择会带来什么后果?
不理解函数与方法的本质区别和适用场景,可能会让你写出不够“地道”的 Go 代码,甚至在面对接口实现、状态修改、代码组织等问题时做出次优的设计决策。
这节课,我们就来深入辨析 Go 中的函数与方法。我将带你:
理解函数作为“一等公民”的含义及其应用。
掌握方法的本质——为类型绑定行为,并重点区分“值接收者”和“指针接收者”的差异与影响。
明确在不同场景下,选择函数还是方法的判断依据。
下面先让我们一起走进函数的世界。
公开
同步至部落
取消
完成
0/2000
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结

1. Go语言中的函数是一等公民,具有与其他普通数据类型相同的权利,可以被赋值给变量、作为参数传递给其他函数、作为另一个函数的返回值以及存储在数据结构中。 2. 函数的类型由参数类型列表和返回值类型列表共同决定,可以使用函数字面量声明函数类型的变量。 3. Go函数的设计在参数和返回值方面非常灵活,支持类型简写、多返回值、具名返回值和可变参数。 4. 匿名函数和闭包是Go语言中的重要特性,闭包可以形成函数值,引用了其函数体之外的变量,常用于实现计数器、生成器、事件处理回调和goroutine传参等。 5. 方法的声明与调用方法的声明与函数类似,但在 func 关键字和方法名之间,多了一个接收者(receiver)的声明。 6. 值接收者 vs 指针接收者:在定义方法时,接收者的类型可以设置为值类型 T 或指针类型 *T。这两类接收者在使用上有一些区别。 7. 方法集:每个类型都有一个与之关联的方法集,方法集定义了该类型可以调用的所有方法的集合。 8. 方法值和方法表达式:方法可以像函数一样被赋值给变量,或者作为参数传递给其他函数。这种特性称为方法值(method value),我们也可以直接通过类型调用方法,这种称为方法表达式(method expression)。 9. 设计抉择:何时定义函数,何时定义方法?核心判断依据是:这个操作是与某个特定类型的数据紧密相关,还是一个更通用的、独立的操作?
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《TonyBai · Go 语言进阶课》,新⼈⾸单¥59
《TonyBai · Go 语言进阶课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论