[TOC] # 方法 方法总是绑定对象实例,并隐式的将实例作为第一实参(receiver),方法的语法如下 ~~~ func(receiver ReceiverType) funcName(parameters) (results) ~~~ * 参数receiver可重新命名.如方法中未曾使用,可省略参数名 * **参数receiver类型可以是T或*T.基类型T不能是接口或指针** * 不支持重载方法,也就是说,不能定义名字相同但是不同参数的方法 ## 给某个类型绑定函数 ~~~ type long int //面向对象,方法:某个类型绑定一个函数 func (tmp long) Add02(other long) long { return tmp + other } func main() { //定义一个变量 var a long = 2 //调用方式: 变量名.函数(所需参数) r := a.Add02(3) fmt.Println("r = ", r) } ~~~ 输出 ~~~ r = 5 ~~~ ~~~ type Person struct { name string sex byte age int } func (tmp Person) PrintInfo() { fmt.Println("tmp = ", tmp) } func main() { p := Person{"mike", 'm', 18} p.PrintInfo() } ~~~ ~~~ type Person struct { name string sex byte age int } func (p *Person) setInfo(n string, s byte, a int) { p.name = n p.sex = s p.age = a } func main() { var p2 Person //第二个参数会转ascii码 (&p2).setInfo("111", 'f', 22) fmt.Println(p2) } ~~~ **调用着,指针和非指针都会自动转换** 用实例value和pointer调用方法(含匿名字段)不受方法约束,编译器总是查找全部方法,并自动转换receiver实参 ## 方法的继承 ~~~ type Person struct { name string sex byte age int } type Student struct { Person //匿名字段 id int addr string } func (p *Person) PrintInfo() { fmt.Println(*p) } func main() { s := Student{Person{"mike", 'm', 18}, 66, "111"} //继承性 s.PrintInfo() } ~~~ 输出 ~~~ {mike 109 18} ~~~ 子方法把父方法给继承过来了,但是是父方法调用的 ## 方法重写 Student也实现了一个方法,这个方法和person同名,这种叫重写 ~~~ type Person struct { name string sex byte age int } type Student struct { Person //匿名字段 id int addr string } func (s *Student) PrintInfo() { fmt.Println(*s) } func (p *Person) PrintInfo() { fmt.Println(*p) } func main() { s := Student{Person{"mike", 'm', 18}, 66, "111"} //父类调用的 s.PrintInfo() //显式调用 s.Person.PrintInfo() } ~~~ ## 方法值 ~~~ type Person struct { name string sex byte age int } func (p *Person) PrintInfo() { fmt.Println(*p) } func main() { p := Person{"mike", 'm', 18} //传统调用方式 p.PrintInfo() //保存方法入口地址,不带() PFunc := p.PrintInfo PFunc()//等价于p.PrintInfo() } ~~~ ## 方法表达式 显示把接收者传递过去 ~~~ type Person struct { name string sex byte age int } func (p *Person) PrintInfo() { fmt.Println(*p) } func main() { p := Person{"mike", 'm', 18} //方法表达式,这边没接收者 f := (*Person).PrintInfo f(&p) //显示把接收者传递过去 } ~~~