
go 语言中虽允许将方法接收者命名为 `this`,但违背官方代码审查惯例,且易引发对值/指针语义的误解;应优先使用描述性、小写、简短的名称(如 `m`、`s` 或具体结构名缩写)。
在 Go 中,方法接收者(receiver)的命名完全由开发者决定,语法上没有任何限制——你确实可以写 func (this MyStruct) getSomeField() string,程序能正常编译和运行。技术上完全可行,但风格上强烈不推荐。
官方《Code Review Comments》明确指出:
❌ 不要使用泛化名称,例如 "me"、"this" 或 "self"——这类标识符常见于强调“方法属于对象”的面向对象语言(如 Java、Python),而 Go 的设计哲学更侧重“函数作用于数据”,强调清晰性与一致性。
更重要的是,语义混淆风险真实存在:
- 在 Java/C++/C# 中,this 永远是当前对象的隐式指针;
- 而 Go 的接收者可以是值类型(func (m MyStruct) ...)或指针类型(func (m *MyStruct) ...),二者行为截然不同(前者操作副本,后者可修改原值)。用 this 会错误暗示“总是可寻址”,掩盖 Go 接收者本质的灵活性与意图。
✅ 推荐实践:
- 使用小写、简短、具描述性的名称:
- 单字母:s(struct)、m(model)、b(buffer)、r(reader);
- 缩写:ms(MyStruct)、cfg(Config)、srv(Server);
- 名称应反映用途而非语言惯性,例如:
type Config struct {
Timeout int
Host string
}
// ✅ 清晰、符合 Go 风格
func (c *Config) Validate() error {
if c.Timeout <= 0 {
return errors.New("timeout must be positive")
}
return nil
}
// ✅ 值接收者亦可读(当无需修改时)
func (c Config) String() string {
return fmt.Sprintf("Config{Host:%q, Timeout:%d}", c.Host, c.Timeout)
}⚠️ 注意事项:
- 避免 self/this/me 等 OOP 风格关键词,即使团队熟悉其他语言;
- 同一包内保持接收者命名一致(如全用 s 表示 struct,勿混用 s/m/this);
- 若结构体有明确领域含义(如 User、Router),优先用其小写缩写(u、r),提升上下文可读性。
总结:Go 的简洁性源于克制与约定。放弃 this 不是妥协,而是拥抱 Go 的本质——让代码意图自明,而非依赖历史惯性。










