Go 不推荐用 this(或 self、me)命名方法接收者,因其违背 Go 的函数式设计哲学:接收者本质是显式参数,应体现类型身份与语义角色,而非引入 OOP 隐式上下文;统一使用 this 还会模糊值接收者(副本)与指针接收者(可变原值)的关键语义差异。
go 不推荐用 `this`(或 `self`、`me`)命名方法接收者,因其违背 go 的函数式设计哲学:接收者本质是显式参数,应体现类型身份与语义角色,而非引入 oop 隐式上下文;统一使用 `this` 还会模糊值接收者(副本)与指针接收者(可变原值)的关键语义差异。
在 Go 中,方法并非传统面向对象语言中的“成员函数”,而是绑定到类型的函数——接收者(receiver)本质上就是该函数的第一个参数。这一点可通过 Go 的语法糖反证:obj.Method() 等价于 (T).Method(obj),完全符合普通函数调用逻辑。例如:
package main
import "fmt"
type Person struct {
Name string
Age int
}
// ✅ 推荐:接收者名反映类型身份(p → Person)
func (p Person) Greet() string {
return fmt.Sprintf("Hello, I'm %s", p.Name) // 操作副本,不影响原值
}
// ✅ 推荐:指针接收者明确传达可变意图(p *Person)
func (p *Person) GrowOld() {
p.Age++ // 修改原值
}
func main() {
alice := Person{Name: "Alice", Age: 30}
fmt.Println(alice.Greet()) // Hello, I'm Alice
fmt.Println(alice.Age) // 30(未变)
alice.GrowOld()
fmt.Println(alice.Age) // 31(已修改)
}
这段代码清晰展示了两个关键事实:
- p Person 是值接收者,方法内操作的是 alice 的拷贝;
- p *Person 是指针接收者,p 直接指向原始结构体,修改生效。
若将二者都命名为 this,如 func (this Person) Greet() 和 func (this *Person) GrowOld(),表面上“统一”,实则掩盖了底层语义鸿沟:
? this 在 Java/C++/Python 中恒为隐式指针,读者易误判 this.Age++ 总会影响原值;
? Go 却要求开发者显式选择值或指针语义——这正是其“少即是多”哲学的体现。
因此,Go 官方《Code Review Comments》明确指出:
针对嵌入式/固件项目的专家代码审查,采用双模型交叉审查(Claude + Codex via ACP),检测内存安全、中断危险、RTOS陷阱...
❌ 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.
✅ 正确实践应遵循三条核心原则:
- 简短且具标识性:优先使用类型首字母小写缩写(如 s for Struct、c for Config、r for Reader);
- 保持一致性:同一类型在值/指针接收者中复用相同名称(如 s MyStruct 与 s *MyStruct);
- 必要时增强语义:当缩写易歧义时,可稍作扩展(如 cfg Config、srv *Server),但避免冗余(如 myStructInstance)。
最后需强调:这不是语法限制,而是 Go 社区长期演进形成的可读性契约。使用 this 虽能编译通过,却会降低代码的自解释性,增加新成员理解成本,并弱化 Go 区别于其他语言的核心优势——清晰、正交、无隐藏行为。坚持简洁、显式、语义化的接收者命名,才是真正写出“Go-like”代码的第一步。










