Go语言里靠匿名结构体实现继承,嵌入到新的结构体里面。如果一个struct嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构的字段和方法,从而实现继承。名字不管大写还是小写都可以用。
package main
import "fmt"
//共同的结构体
type Student struct {
Name string
Age int
Score int
}
func (stu *Student) ShowInfo(){
fmt.Printf("学生名字=%v,年龄=%v,成绩=%v",stu.Name,stu.Age,stu.Score)
}
func (pu *Pupil) ShowInfo(){
fmt.Printf("学生名字=%v,年龄=%v,成绩=%v",pu.Name,pu.Age,pu.Score)
}
func (stu *Student) SetScore(score int ){
stu.Score= score
}
//嵌入匿名结构体
type Pupil struct {
Student
Name string
}
type Graduate struct {
Student
}
func main() {
var pupil = &Pupil{}
pupil.Student.Name="Tom"
pupil.Student.Age = 8
pupil.Student.SetScore(70)
pupil.Student.ShowInfo()
pupil.Name="Love"
pupil.Age= 20
pupil.SetScore(60)
pupil.ShowInfo()
pupil.Student.ShowInfo()
fmt.Println(pupil.Name, pupil.Student.Name)
}
当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则访问,如果希望访问匿名结构体的字段和方法,通过匿名结构体名字来访问:
pupil.Student.Name="Tom" //访问匿名结构体Student
如果有有名结构体,访问其字段时,必须带上其名字。
type Pupil struct {
Stu Student
Name string
}
func main() {
var pupil = &Pupil{}
pupil.Stu.Name="Tom"S3
}
多重继承
如果一个struct里嵌套多个匿名结构体,
type Student struct {
Name string
Age int
Score int
}
type People struct {
Sex string
}
type Pupil struct {
Student
People
}