调用方法顺序:
package main
import (
"fmt"
)
type People struct {}
func (p *People) ShowA() {
fmt.Println("ShowA")
p.ShowB() // 调用People结构体的ShowB方法
}
func (p *People) ShowB() {
fmt.Println("ShowB")
}
type Teacher struct {
People
}
func (p *Teacher) ShowB() {
fmt.Println("Teacher ShowB")
}
func mian() {
t := Teacher{}
t.ShowA() // 调用People的ShowA方法
}
打印结果:
ShowA
ShowB
结构体方法的定义与使用:
- 结构体方法中结构体接收者决定当前类型是值类型还是指针类型
package main
import "fmt"
type Person struct {
name string
age int
}
// 值拷贝
func (p Person) Work() {
fmt.Println(p.name, "在工作..")
p.name = "zs222" // 这里修改不影响原结构体数据
}
// 指针
func (p *Person) Work2() {
fmt.Println(p.name, "在工作..")
p.name = "li222"
}
func main() {
p := Person{name: "zs", age: 12}
p.Work()
fmt.Println(p) // {zs 12}
p := Person{name: "zs", age: 12}
p.Work2()
fmt.Println(p) // {li222 12}
p2 := &Person{name: "lisi", age: 14}
p2.Work()
fmt.Println(p2) // &{lisi 14}
p2 := &Person{name: "lisi", age: 14}
p2.Work2()
fmt.Println(p2) // &{li222 14}
}
“子类访问父类方法”:
package main
import "fmt"
type Person struct {
name string
age int
}
type Student struct {
Person
school string
}
func (p Person) Work() {
fmt.Println("父类方法")
}
func (p Student) Work() {
fmt.Println("子类方法")
}
func main() {
p := Person{name: "zs", age: 12}
p.Work() // 父类方法
s := Student{school: "清华小学", Person: Person{name: "sz", age: 12}}
// 匿名字段,字段提升-->子类对象,可以直接访问父类的字段
fmt.Println(s.age) // 12
fmt.Println(s.name) // sz
fmt.Println(s.school) // 清华小学
// 相当于重写其他语言中父类方法
s.Work() // 子类方法
s.Person.Work() // 父类方法
}