Go 中方法接收者命名规范:为何不推荐使用 this

10次阅读

Go 中方法接收者命名规范:为何不推荐使用 this

go 语言中虽允许将方法接收者命名为 `this`,但违背官方代码审查惯例,且易引发对值/指针语义的误解;应优先使用描述性、小写、简短的名称(如 `m`、`s` 或具体结构名缩写)。

go 中,方法接收者(receiver)的命名完全由开发者决定,语法上没有任何限制——你确实可以写 func (this MyStruct) getSomeField() String,程序能正常编译和运行。技术上完全可行,但风格上强烈不推荐。

官方《Code Review Comments》明确指出:

❌ 不要使用泛化名称,例如 “me”、”this” 或 “self”——这类标识符常见于强调“方法属于对象”的面向对象语言(如 javapython),而 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 的本质——让代码意图自明,而非依赖历史惯性。

text=ZqhQzanResources