
Go 语言中 (c App) 是方法的接收器声明,用于将函数绑定到特定类型,c 是接收器变量名,App 是其类型,功能类似于其他语言中的 this 或 self。
go 语言中 `(c app)` 是方法的接收器声明,用于将函数绑定到特定类型,`c` 是接收器变量名,`app` 是其类型,功能类似于其他语言中的 `this` 或 `self`。
在 Go 语言中,函数与方法有本质区别:普通函数不属于任何类型,而方法必须关联一个类型,并通过接收器(receiver)显式声明这种归属关系。接收器语法 (c App) 出现在函数关键字 func 之后、函数名之前,是 Go 实现面向对象特性的核心机制之一。
接收器的基本结构
接收器由两部分组成:括号内的 变量名 + 类型,例如 (c App) 表示:
- c:接收器的局部变量名(仅在该方法体内有效),推荐使用简洁、语义清晰的短名(如 a、s、r),而非冗长的 this 或 self;
- App:接收器的类型,可以是命名类型(如 App、*http.Request),也可以是指针类型(如 *App)——选择值接收器还是指针接收器,取决于是否需要修改原始值或避免拷贝开销。
// 值接收器:操作副本,不改变原值(适用于小结构体或只读场景)
func (c App) SaveSettings(setting string) revel.Result {
// c 是 App 类型的副本,修改 c 不影响调用方的原始实例
return revel.JSON(200)
}
// 指针接收器:可修改原始值,且避免大对象拷贝(更常用)
func (c *App) UpdateConfig(cfg Config) error {
c.config = cfg // 直接修改原始实例的字段
return nil
}关键注意事项
- ✅ 一致性原则:若某个类型已有指针接收器方法,则所有方法都应统一使用指针接收器,否则可能引发编译错误(例如无法对 *App 调用值接收器方法,反之亦然);
- ✅ 可寻址性要求:只有可寻址的值(如变量、解引用后的指针)才能调用指针接收器方法;
- ❌ 禁止使用接口或未命名类型作为接收器类型:接收器类型必须是已定义的命名类型(如 type App struct{...}),不能是 struct{} 或 interface{};
- ? 命名惯例:Go 官方推荐接收器名长度为 1–2 个字符,且具上下文意义(如 s for string, r for Reader, c for config 或 controller),详见 Go Code Review Comments。
总结
接收器 (c App) 不是装饰语法,而是 Go 方法系统的设计基石:它明确表达了“谁拥有这个行为”,使类型具备封装性与可扩展性。理解并规范使用接收器,是编写可维护、符合 Go 风格代码的前提。实践中,优先考虑指针接收器,除非明确需要值语义且类型足够轻量。










