引言
函数允许你将逻辑组织到可重复的过程中,每次运行时可以使用不同的参数。在定义函数的过程中,你会经常发现多个函数可能每次都操作同一段数据。Go可以识别这种模式,并允许您定义特殊的函数,称为方法,其目的是对某些特定类型的实例进行操作,称为接收器。为类型添加方法不仅可以让你了解数据是什么,还可以让你了解如何使用这些数据。
定义方法
定义方法的语法与定义函数的语法类似。唯一的区别是在func
关键字后面添加了一个额外的参数来指定方法的接收者。接收器是你想要定义方法的类型声明。下面的例子定义了一个struct类型的方法:
package mainimport "fmt"type Creature struct {Name stringGreeting string
}func (c Creature) Greet() {fmt____Printf("%s says %s", c.Name, c.Greeting)
}func main() {sammy := Creature{Name: "Sammy",Greeting: "Hello!",}Creature.Greet(sammy)
}
如果运行这段代码,输出将是:
OutputSammy says Hello!
我们创建了一个名为Creature
的结构体,其中包含Name
和Greeting
的string
字段。这个Creature
只定义了一个方法Greet
。在接收器声明中,我们将Creature
的实例赋值给变量c
,这样我们就可以在组装fmt____Printf
中的问候消息时引用Creature
的字段。
在其他语言中,方法调用的接收者通常通过一个关键字来引用(例如:’ this ‘或’ self ')。Go将接收器视为与其他变量一样的变量,因此您可以随意命名为您喜欢的任何名称。社区对此参数的首选样式是接收者类型的第一个字符的小写版本。在这个例子中,我们使用c
,因为接收器类型是Creature
。
在main
函数体中,我们创建了一个Creature
实例,并为它的Name
和Greeting
字段指定了值。我们在这里通过将类型名和方法名与____
连接起来并提供Creature
实例作为第一个参数来调用Greet
方法。
Go提供了另一种更方便的方法来调用结构体实例的方法,如下例所示:
package mainimport "fmt"type Creature struct {Name stringGreeting string
}func (c Creature) Greet() {fmt____Printf("%s says %s", c.Name, c.Greeting)
}func main() {sammy := Creature{Name: "Sammy",Greeting: "Hello!",}sammy.Greet()
}
如果运行这个,输出将与前面的例子相同:
OutputSammy says Hello!
这个例子和前一个相同,但这次我们使用点表示法来调用Greet