/*
go方法
一般的函数定义叫做函数
定义在结构提上面的函数叫做该结构体的方法
*/
package main
import (
"fmt"
)
type rect struct {
width int
height int
}
/*
这个area方法有一个限定类型*rect
表示这个函数是定义在rect结构体上的方法
*/
func (r *rect) area() int {
return r.width * r.height
}
/*
方法的定义限定类型可以为结构体类型
也可以是结构体指针类型
区别在于如果限定类型是结构体指针类型
那么在该方法内部可以修改结构体成员信息
*/
func (r *rect) perim() int {
return 2*r.width + 2*r.height
}
func main() {
r := rect{width: 10, height: 5}
r.area()
r.perim()
/*
go语言会自动识别方法调用的参数是结构体变量还是结构体指针
如果要修改结构体内部成员值那么使用结构体指针作为限定类型
也就是说参数若是结构体变量仅仅会发生值拷贝
*/
rp := &r
rp.area()
rp.perim()
}
/*
方法是函数的语法糖
当函数与某个特定的类型绑定那么他就是一个方法
我们可以将方法还原成函数
*/
func main() {
p := Person{2, "张三"}
p.test()
var f1 func(int) = p.test
f1(2)
Person.test(p, 3)
var f2 func(Person, int) = Person.test
f2(p, 4)
}
type Person struct {
Id int
Name string
}
func (p *Person) test(x int) {
fmt.Println(p.Id, p.Name)
}
/*
使用匿名字段时 实现模拟继承
即可以直接访问匿名字段的方法
有隐藏规则
*/
func main() {
p := Student{Person{}, 25}
p.test()
}
type Person struct {
Id int
Name string
}
/*
知识点:
struct 的匿名字段
匿名字段的方法会被继承
*/
type Student struct {
Person
Score int
}
func (p *Person) test() {
fmt.Println("person test")
}
func (s *Student) test() {
fmt.Println("student test")
}