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

Methods 在Golang中向结构添加方法时,为什么必须声明变量名?,methods,go,struct,Methods,Go,Struct,假设我有一个结构 type Rectangle struct { length, width int } 我想给它添加一个方法: func (r Rectangle) Area() int { return r.length * r.width } 为什么我必须在这里给它一个变量名r?,因为没有表示实际接收方值的隐式标识符(如Java中的this),如果您想引用接收方值(矩形值)的字段或方法,您需要一个可以使用的标识符 请注意,规范不要求您命名接收器值,例如,以下使用是有效语

假设我有一个结构

type Rectangle struct {
    length, width int
}
我想给它添加一个方法:

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

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

,因为没有表示实际接收方值的隐式标识符(如Java中的
this
),如果您想引用接收方值(
矩形
值)的字段或方法,您需要一个可以使用的标识符

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

func (_ Rectangle) Foo() string {
    return "foo"
}
甚至是这样:省略接收方名称(参数名称):

规范中的相关章节:

其中参数为:


正如您在最后一行中所看到的,
IdentifierList
是可选的(但
类型
是必需的)。

结构方法与类方法类似。变量“r”是对应用该方法的结构/类实例/对象的引用。没有该引用,您将无法访问该结构/对象中包含的任何内容

例如,我使用您的结构创建了
smallRectangle

var smallRectangle = Rectangle{5,3}
现在我想用矩形法计算面积
area

area := smallRectangle.Area()
让我们看看函数中发生了什么<方法声明中的code>r成为
smallRectangle
副本,因为这是调用它的struct对象

func (smallRectangle Rectangle) Area() int {
    return smallRectangle.length * smallRectangle.width
}
如Icza所示,没有像
self
this
这样的隐式标识符,因此该方法访问结构值的唯一方法是通过标识符
r

var smallRectangle = Rectangle{5,3}
area := smallRectangle.Area()
func (smallRectangle Rectangle) Area() int {
    return smallRectangle.length * smallRectangle.width
}