我们说我有一个结构
type Rectangle struct {
length, width int
}
我想为它添加一个方法:
func (r Rectangle) Area() int {
return r.length * r.width
}
为什么我必须在这里给它一个变量名r
?
答案 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所示,没有隐式标识符,如self
或this
,因此方法访问结构值的唯一方法是通过标识符r
。