继承可以解决代码复用,让我们的编程更加靠近人类思维。 当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体(比如刚才的

Student),在该结构体中定义这些相同的属性和方法。

其它的结构体不需要重新定义这些属性(字段)和方法,只需嵌套一个 Student 匿名结构体即可。 [画 出示意图]

也就是说:在 Golang 中,如果一个 struct 嵌套了另一个匿名结构体,那么这个结构体可以直接访 问匿名结构体的字段和方法,从而实现了继承特性。

嵌套匿名结构体的基本语法

type Goods struct {

Name string

Price int

}

type Book struct {

Goods //这里就是嵌套匿名结构体 Goods Writer string

}

快速入门案例

Ø 案例

我们对 extends01.go 改进,使用嵌套匿名结构体的方式来实现继承特性,请大家注意体会这样编程

的好处

Ø 代码实现

package main

import (

"fmt"

)

//编写一个学生考试系统 type Student struct {

Name string Age int Score int

}

//将 Pupil 和 Graduate 共有的方法也绑定到 *Student 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 //嵌入了 Student 匿名结构体

}

//显示他的成绩

//这时 Pupil 结构体特有的方法,保留

func (p *Pupil) testing() { fmt.Println("小学生正在考试中.....")

}

//大学生, 研究生。。

//大学生

type Graduate struct {

Student //嵌入了 Student 匿名结构体

}

//显示他的成绩

//这时 Graduate 结构体特有的方法,保留

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()

graduate := &Graduate{} graduate.Student.Name = "mary~" graduate.Student.Age = 28 graduate.testing() graduate.Student.SetScore(90) graduate.Student.ShowInfo()