为什么go中的receiver name不推荐使用this或者self

新世界杂货铺 · · 1719 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言

在日常的开发中我们除了定义函数以外, 我们还会定义一些方法。这本来没有什么, 但是一些从PHP或者其他面向对象语言转GO的同学往往会把receiver name命名为this, self, me等。

笔者在实际项目开发中也遇到类似的同学, 屡次提醒却没有效果,于是决心写下这篇文章以便好好说服这些同学。

CR标准做法

首先我们来看一下GO推荐的标准命名Receiver Names,以下内容摘抄自https://github.com/golang/go/wiki/CodeReviewComments#receiver-names

The name of a method's receiver should be a reflection of its identity;
often a one or two letter abbreviation of its type suffices (such as "c" or "cl" for "Client"). 
Don't use generic names such as "me", "this" or "self", identifiers typical of object-oriented languages that gives the method a special meaning. 
In Go, the receiver of a method is just another parameter and therefore, should be named accordingly. 
...

简单翻译总结有如下2点:

  1. 方法接受者名称应反映其身份, 并且不要使用me, this, self这些面向对象语言的典型标志符。
  2. 在go中方法接受者其实就是方法的另一个参数。

Receiver是方法的第一个参数!

上面的第二点, 可能不是很好理解,所以我们直接看下面的demo:

// T ...
type T int

// Println ...
func (t T) Println() {
    fmt.Println("value: %v", t)
}

func main() {
    t := T(1)
    t.Println()
    T.Println(t)
}
// output:
value: 1
value: 1

通过上面的demo, 我们知道接受者可以直接作为第一个参数传递给方法的。而t.Println()应该就是Go中的一种语法糖了。

到这里可能有同学又要问了, 既然Go提供了这种语糖,那我们这样命名有什么问题呢?笔者先不着急解释, 我们继续看下面的demo:

// Test ...
type Test struct {
    A int
}

// SetA ...
func (t Test) SetA(a int) {
    t.A = a
}

// SetA1 ...
func (t *Test) SetA1(a int) {
    t.A = a
}

func main() {
    t := Test{
        A: 3,
    }
    fmt.Println("demo1:")
    fmt.Println(t.A)
    t.SetA(5)
    fmt.Println(t.A)
    t1 := Test{
        A: 4,
    }
    fmt.Println("demo2:")
    fmt.Println(t1.A)
    (&t1).SetA1(6)
    fmt.Println(t1.A)
}
// output:
demo1:
3
3
demo2:
4
6

看上面的demo我们知道, 当receiver不是指针时调用SetA其值根本没有改变。

因为Go中都是值传递,所以你如果对SetA的receiver的名称命名为this, self等,它就已经失去了本身的意义——“调用一个对象的方法就是向该对象传递一条消息”。而且对象本身的属性也并不一定会发生改变。

综上: 请各位读者在对receiver命名时不要再用this, self等具有特殊含义的名称啦。

最后, 祝各位事业有成!

欢迎关注微信公众号和百家号【文章首发】


image

百家号文章地址

https://baijiahao.baidu.com/s?id=1672543412201184988


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:新世界杂货铺

查看原文:为什么go中的receiver name不推荐使用this或者self

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1719 次点击  
加入收藏 微博
1 回复  |  直到 2020-08-19 16:49:06
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传