Golang匿名字段:可以像访问字段成员那样,访问匿名字段方法,go编译器自动查找。
package main import "fmt" type Student struct { id int name string } type Teacher struct { //匿名字段 Student } func (s1 *Student) Play() { fmt.Printf("Student地址:%p,值是%v\n", s1, s1) fmt.Println("我是个学生,但是我就爱玩儿,你能奈我何") } func main() { t1 := &Teacher{Student{1, "银角大王吧"}} //两种方式一样效果 /* t1 := &Teacher{ Student{ 1, "银角大王吧", }, } */ fmt.Printf("t1的内存地址:%p\n", &t1) //通过t1变量,执行结构体Student的方法,查找 t1.Play() // t1 -> Teacher -> *Student }
通过匿名字段可以实现
重写 override
写一个学生管理系统,学生类别有(小学生、中学生、大学生),既然是学生群体都可以(查询成绩、设置成绩)
package main import "fmt" //学生结构体 type Student struct { Name string Age int Score int } //显示学生个人信息方法,接收指针类型 func (stu *Student) ShowInfo() { fmt.Printf("学生姓名:%v 年龄=%d 成绩=%d\n", stu.Name, stu.Age, stu.Score) } //设置学生成绩 func (stu *Student) SetScore(score int) { stu.Score = score } //小学生群体 单词pupil type Pupil struct { //小学生的属性完全可以继承Student学生的属性 Student //继承匿名字段 } //小学生独有方法 func (p *Pupil) testing() { fmt.Println("小学生正在考试中..") } //大学生结构体,同样的也有学生的常见属性 type Graduate struct { Student } //大学生独有的方法 func (g *Graduate) testing() { fmt.Println("大学生正在答辩考试中...") } func main() { p1 := &Pupil{Student{"小学生一号", 7, 99}} p1.testing() p1.ShowInfo() p1.SetScore(100) p1.ShowInfo() fmt.Println("-----------") g1 := &Graduate{Student{"大学生一号", 22, 50}} g1.testing() g1.ShowInfo() g1.SetScore(60) g1.ShowInfo() }
继承给Go程序带来了代码的复用性
提高了,代码的可维护性、扩展性更高了!
注意点:
如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问匿名结构体的方法,从而实现继承 如果一个struct嵌套了另一个【有名】的结构体,那么这个模式叫做组合
原文:https://www.cnblogs.com/open-yang/p/11256881.html