go-struct嵌套和继承
一、结构体嵌套
package main
import "fmt"
type Student struct {
Name string
Age int
Score int
}
func (stu *Student) ShowInfo() {
fmt.Printf("学生名=%v 年龄= %v 成绩=%v\n", stu.Name, stu.Age, stu.Score)
}
func (stu *Student) SetScore(score int) {
stu.Score = score
}
type Pupil struct {
Student
}
func (p *Pupil) testing() {
fmt.Println("小学生正在考试中")
}
type Graduate struct {
Student
}
func (p *Graduate) testing() {
fmt.Println("DA学生正在考试中")
}
func main() {
var pupil = &Pupil{}
pupil.Student.Name = "tom"
pupil.Student.Age = 8
pupil.testing()
pupil.Student.SetScore(30)
pupil.Student.ShowInfo()
var granduate = &Graduate{}
granduate.Student.Name = "w"
granduate.Student.Age =20
granduate.testing()
granduate.Student.SetScore(3)
granduate.Student.ShowInfo()
}
运行结果:
小学生正在考试中
学生名=tom 年龄= 8 成绩=30
DA学生正在考试中
学生名=w 年龄= 20 成绩=3
无论大学生小学生都有年龄和分数,不一样的就是testing()方法是大学生、小学生在考试,所以单独用Pupil和Graduate指针去接收,ShowInfo()和SetScore()用student指针去接收
二、继承
好处:复用性、维护性、扩展性
type Animal struct { Name string age int } func (animal *Animal) SayOk() { fmt.Println("animal say", animal.Name) } func (animal *Animal) hello() { fmt.Println("animal hello", animal.Name) } type Dog struct { Animal } func main() { var dog Dog dog.Animal.Name = "哈市 dog" dog.Animal.age = 20 dog.Animal.SayOk() dog.Animal.hello() dog.Name = "后代dog" dog.age = 1 dog.SayOk() dog.hello() } 运行结果: animal say 哈市 dog animal hello 哈市 dog animal say 后代dog animal hello 后代dog
1.直接访问dog的字段或者方法,dog.Name
2.编译的时候会先看dog对应的有没有Name,如果有则直接滴啊用dog类型的Name,如果没有就去看animal的结构体中有没有这个字段
3.当结构体和匿名结构体都有相同的字段和方法,采用就近原则,如果要指定那就指定一下type Animal struct { Name string age int } func (animal *Animal) SayOk() { fmt.Println("animal say", animal.Name) } func (animal *Animal) hello() { fmt.Println("animal hello", animal.Name) } type Dog struct { Animal Name string } func (dog *Dog) hello() { fmt.Println("dog hello", dog.Name) } func main() { var dog Dog dog.Animal.Name = "哈市 dog" dog.Name = "后代dog" dog.Animal.age = 20 dog.Animal.SayOk() dog.Animal.hello() dog.age = 1 dog.SayOk() dog.hello() } 运行结果: animal say 哈市 dog animal hello 哈市 dog animal say 哈市 dog dog hello 后代dog
本作品采用《CC 协议》,转载必须注明作者和本文链接