概述
办法的申明和一般函数的申明相似,只是在函数名字后面多了一个 接收者参数
(接收者参数将办法绑定到其对应的数据类型上)。
办法能够绑定到任何数据类型上,然而大多数状况下,绑定的都是 构造体。
语法规定
func (接收者参数) 办法名称(参数列表 ...) 返回值列表... { // do something}
例子
构造体办法
package mainimport "fmt"type person struct { name string age int16}func (p person) sayName() { fmt.Printf("Hi, my name is %s\n", p.name)}func (p person) sayAge() { fmt.Printf("Hi, my age is %d\n", p.age)}func main() { tom := &person{ name: "Tom", age: 6, } tom.sayName() tom.sayAge()}// $ go run main.go// 输入如下 /** Hi, my name is Tom Hi, my age is 6*/
构造体指针办法
相比构造体办法,指针构造体办法除了将办法参数变为指针外,在援用对应的字段时,无需加 *
标识符,
这一点和一般指针变量援用时有所区别,须要留神。
package mainimport "fmt"type person struct { name string age int16}func (p *person) sayName() { // 构造体为指针类型 fmt.Printf("Hi, my name is %s\n", p.name)}func (p *person) sayAge() { // 构造体为指针类型 fmt.Printf("Hi, my age is %d\n", p.age)}func main() { tom := &person{ name: "Tom", age: 6, } tom.sayName() tom.sayAge()}// $ go run main.go// 输入如下 /** Hi, my name is Tom Hi, my age is 6*/
编译检测
编译器会对办法的 接收者参数
进行查看,具体来说:
接收者形参为一般变量类型
- 实参为一般变量类型,编译失常
- 实参为指针变量类型,编译失常
接收者形参为指针变量类型
- 实参为一般变量类型,编译报错
- 实参为指针变量类型,编译失常
reference
- Go 圣经