Post
Go 里 receiver name 不建议写成 this,是在强调类型身份
这不只是命名风格问题,背后其实是在避免把方法接收者抽象成一个模糊的统一对象。
第一次看到 golint 这个规则时,我的直觉其实和很多从 Java 过来的人一样:
为什么 receiver 不能直接叫
this?
毕竟 this 这件事很省脑子。你不用为每个 struct 再想一个变量名,统一写法,看起来也整齐。
但后来我越来越觉得,golint 这个约束虽然有点烦,本质上还是有它自己的语言立场。
Go 并不太鼓励把方法接收者理解成传统面向对象语境里的那个“对象自我”。它的方法更像是“对某个具体类型值的操作”,而不是围绕一个统一的对象语义展开。
所以 receiver name 被要求“reflect its identity”,意思其实不是非要大家搞花哨命名,而是要让接收者名字和类型本身建立稳定映射。
比如:
Server用sClient用cRequest用r
这样读代码时,方法体里的接收者并不是一个抽象的 this,而是这个具体类型在当前上下文里的缩写。
这件事带来的一个好处是:代码在跨文件、跨包阅读时,类型感会更强。尤其在 Go 这种接口组合很多、结构体又比较轻量的语言里,接收者如果都写成 this,其实不利于快速建立“当前到底是谁在做事”的直觉。
当然,从纯效率角度说,我还是能理解很多人会嫌麻烦。因为这个规则本身不会改变程序行为,更多是在统一团队阅读体验。
所以我的结论比较简单:
- 如果是
Go项目,就按Go社区的约定来,别硬拿其他语言的习惯对抗。 - 如果只是个人审美上更喜欢
this,也不是完全不能理解,但最好别跟 lint 工具和团队规范拧着来。
这种事最终不在于谁绝对正确,而在于语言社区到底想把代码引向什么样的阅读方式。Go 在这里强调的,显然不是“对象感”,而是“类型身份感”。