
go 语言虽支持面向对象风格的语法,但官方明确建议避免使用 `this`、`self` 或 `me` 等泛化名称作为方法接收者标识符,因其违背 go 的命名哲学——强调清晰性、函数式思维与值/指针语义的显式表达。
在 Go 中,方法接收者(receiver)的名称纯粹是局部变量名,不具语言级特殊含义。技术上完全允许写成 func (this MyStruct) getSomeField() string,编译和运行均无问题。但可读性与一致性才是 Go 社区高度重视的设计准则。
根据 Go 官方代码审查评论指南,明确指出:
❌ Don’t use generic names such as “me”, “this” or “self”, identifiers typical of object-oriented languages that place more emphasis on methods as opposed to functions.
这意味着:Go 更倾向于将方法视为“绑定到类型的函数”,而非传统 OOP 中“属于对象的成员函数”。因此,接收者名称应像普通参数一样——具体、有意义、体现其角色或用途。例如:
func (m MyStruct) getSomeField() string { // ✅ m 表示 "my struct" 或 model
return m.someField
}
func (s *MyStruct) setSomeField(v string) { // ✅ s 表示 struct pointer;*明确传达可变意图*
s.someField = v
}
func (ms MyStruct) String() string { // ✅ ms 是 MyStruct 的自然缩写
return fmt.Sprintf("MyStruct{someField: %q}", ms.someField)
}此外,还有一个关键差异常被忽略:在 C++、Java、Python 等语言中,this/self 总是隐式指向当前对象的指针(或引用);而 Go 的接收者可以是值类型(如 func (m MyStruct))或指针类型(如 func (m *MyStruct))。若统一用 this,反而会模糊这一重要语义区别——值接收者操作的是副本,指针接收者才影响原值。使用 m 或 ms 等中性缩写,配合显式的 * 符号,能更准确传达意图。
✅ 最佳实践总结:
- 接收者名应简短(通常 1–3 字母)、小写、具描述性(如 s、c、r、b 分别代表 struct、config、reader、buffer);
- 避免 this/self/me/obj 等无信息量的通用词;
- 值接收者优先用单字母(如 s),指针接收者可沿用相同字母(s *MyStruct),保持一致性;
- 在大型结构体或复杂逻辑中,可酌情使用更具语义的名称(如 cfg Config、srv *Server),前提是提升可读性而非增加冗余。
遵循这些约定,不仅让代码更符合 Go 生态规范,也显著增强团队协作效率与长期可维护性。










