为什么在向Golang中的结构添加方法时必须声明变量名?

时间:2016-03-22 11:15:41

标签: methods go struct

我们说我有一个结构

type Rectangle struct {
    length, width int
}

我想为它添加一个方法:

func (r Rectangle) Area() int {
    return r.length * r.width
}

为什么我必须在这里给它一个变量名r

2 个答案:

答案 0 :(得分:8)

因为没有隐含的标识符表示实际的接收者值(如Java中的this),而 if 你想要引用接收者值的字段或方法({{ 1}} value),您需要一个可以使用的标识符。

请注意,规范不要求您命名接收器值,例如使用blank identifier的以下内容是有效的语法:

Rectangle

甚至这样:省略接收者名称(参数名称):

func (_ Rectangle) Foo() string {
    return "foo"
}

规范中的相关部分:Method declarations

func (Rectangle) Foo() string {
    return "foo"
}

参数为:

MethodDecl   = "func" Receiver MethodName ( Function | Signature ) .
Receiver     = Parameters .

正如您在最后一行中所看到的,Parameters = "(" [ ParameterList [ "," ] ] ")" . ParameterList = ParameterDecl { "," ParameterDecl } . ParameterDecl = [ IdentifierList ] [ "..." ] Type . 是可选的(但需要IdentifierList)。

答案 1 :(得分:1)

Struct方法就像Class方法。变量'r'是对应用该方法的struct / class实例/对象的引用。如果没有该引用,您将无法访问该结构/对象中包含的任何内容。

让我们举例说,我使用你的结构创建了smallRectangle

var smallRectangle = Rectangle{5,3}

现在我想使用Rectangle方法Area

计算面积
area := smallRectangle.Area()

让我们看看函数中发生了什么。方法声明中的r变为smallRectangle副本,因为这是调用它的结构对象。

func (smallRectangle Rectangle) Area() int {
    return smallRectangle.length * smallRectangle.width
}

如Icza所示,没有隐式标识符,如selfthis,因此方法访问结构值的唯一方法是通过标识符r