为什么go中的receiver name不推荐使用this或者self
在Go语言中,我们可以定义一些方法来操作一个对象,这些方法中有一个特殊的receiver参数,它代表了对象实例本身。但是我们在定义receiver参数的名字时,并不推荐使用this或者self这样的名称。这是为什么呢?在这篇文章中,我们将解释这个问题的答案。
1. Go语言中receiver的定义
在Go语言中,我们可以定义receiver参数作为一个方法的第一个参数。定义方法的时候,receiver参数需要放在函数名的前面,并且需要使用一对括号将它们括起来,如下面这个例子所示:
type MyStruct struct {}
func (m MyStruct) DoSomething() {
// do something
}
这个例子中,我们定义了一个名为MyStruct的结构体,并为其定义了一个DoSomething()方法。DoSomething()方法的receiver参数类型为MyStruct,也就是说这个方法是属于MyStruct这个类型的对象实例调用的。此时的receiver参数名字为m,这个名称是任意指定的。
2. Go语言中this和self的问题
在其他一些编程语言中,如C++和Python,我们都可以使用this和self这两个关键字来表示对象实例本身。所以有些程序员可能也会在定义Go语言中的receiver参数的时候,沿用这种命名方式。
但是,Go语言中并没有这样的关键字。如果我们在receiver参数的名字中使用this或者self这样的关键字,编译器会报错。可以看下面这个例子:
func (this MyStruct) DoSomething() {
// do something
}
编译器会报错:
syntax error: unexpected MyStruct, expecting (
这是因为在Go语言中,使用receiver参数来表示对象实例本身的时候,它的名字可以是任意的,只需要符合一些命名规则即可。
3. Go语言中receiver参数名的命名规则
虽然在Go语言中,receiver参数的名字可以是任意的,但是一般情况下,我们会使用一些简短的名字来表示它。这些名字的顺序通常是receiver类型的第一个字母的小写形式,比如下面这个例子:
type MyStruct struct {}
func (m MyStruct) DoSomething() {
// do something
}
其中,MyStruct类型的第一个字母是M,所以我们在定义receiver参数的时候使用了小写字母m。
这样的命名方式有几个好处:
* 易于理解:使用类型的第一个字母的小写形式来表示receiver参数的对象实例,可以让代码的可读性更好。因为我们在阅读代码的时候可以快速地知道这个方法是属于哪个类型的对象实例调用的。
* 简洁:使用短小的名字可以让我们在编写代码的时候省略一些不必要的字符,让代码更加简洁。这样可以提高我们编写代码的效率,并且减少潜在的拼写错误。
* 规范:这样的命名方式也是一个编程规范。在Go语言的标准库中,也使用了相同的命名规则来定义receiver参数的名字。
4. 结论
Go语言中的receiver参数名字可以是任意的,只需要满足一些命名规则即可。虽然在其他语言中使用this和self这样的关键字来表示对象实例本身很方便,但是在Go语言中并不推荐这样做。相反,为了保持代码的可读性和规范性,我们推荐使用类型的第一个字母的小写形式来表示receiver参数的名字。
此外,Go语言还提供了一些特殊的receiver参数类型,比如指针类型和空接口类型等。这些特殊的类型可以让我们更加灵活地定义方法和操作对象实例。
参考资料
[1] Go语言官方文档 https://golang.org/doc/faq#methods_on_values_or_pointers
[2] Effective Go https://golang.org/doc/effective_go.html#names