Go語言里靠匿名結(jié)構(gòu)體實現(xiàn)繼承,嵌入到新的結(jié)構(gòu)體里面。如果一個struct嵌套了另一個匿名結(jié)構(gòu)體,那么這個結(jié)構(gòu)體可以直接訪問匿名結(jié)構(gòu)的字段和方法,從而實現(xiàn)繼承。名字不管大寫還是小寫都可以用。
package main
import "fmt"
//共同的結(jié)構(gòu)體
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
}
//嵌入匿名結(jié)構(gòu)體
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)
}
當結(jié)構(gòu)體和匿名結(jié)構(gòu)體有相同的字段或者方法時,編譯器采用就近訪問原則訪問,如果希望訪問匿名結(jié)構(gòu)體的字段和方法,通過匿名結(jié)構(gòu)體名字來訪問:
pupil.Student.Name="Tom" //訪問匿名結(jié)構(gòu)體Student
如果有有名結(jié)構(gòu)體,訪問其字段時,必須帶上其名字。
type Pupil struct {
Stu Student
Name string
}
func main() {
var pupil = &Pupil{}
pupil.Stu.Name="Tom"S3
}
多重繼承
如果一個struct里嵌套多個匿名結(jié)構(gòu)體,
type Student struct {
Name string
Age int
Score int
}
type People struct {
Sex string
}
type Pupil struct {
Student
People
}