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
}