1. 继承的基本介绍
继承可以解决代码复用,让我们的编程更加靠近人类的思维。
当多个结构体存在相同的属性(字段)和方法时,可以从这些结构中抽象出结构体。
其它的结构体不需要重新定义这些属性(字段)和方法,只需要嵌套一个Student
匿名结构体即可。
也就是说:在go中,如果一个struct
嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性。
嵌套匿名结构体的基本语法
1 2 3 4 5 6 7
| type Goods struct { Name string Price int } type Book struct { Goods }
|
2. 案例
使用嵌套匿名结构体的方式来实现继承特性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| 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 }
func (stu *Student) GetSum(n1 int, n2 int) int { return n1 + n2 }
type Pupil struct { Student }
func (p *Pupil) testing() { fmt.Println("小学生正在考试中......") }
type Graduate struct { Student }
func (p *Graduate) testing() { fmt.Println("大学生正在考试中") }
func main() { pupil := &Pupil{} pupil.Student.Name = "tom" pupil.Student.Age = 8 pupil.testing() pupil.Student.SetScore(70) pupil.Student.ShowInfo() fmt.Println("res=", pupil.Student.GetSum(1, 2))
graduate := &Graduate{} graduate.Student.Name = "marry" graduate.Student.Age = 28 graduate.testing() graduate.Student.SetScore(90) graduate.Student.ShowInfo() fmt.Println("res=", graduate.Student.GetSum(10, 20)) }
|