Go 中为何不推荐使用 this 作为方法接收者名称

13次阅读

Go 中为何不推荐使用 this 作为方法接收者名称

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++javapython 等语言中,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 生态规范,也显著增强团队协作效率与长期可维护性。

text=ZqhQzanResources