11.Go 嵌入型別

董雷發表於2021-12-31

Go 嵌入型別

什麼事嵌入型別:可以把已有的型別宣告在新的型別裡面,在其他語言可以採用繼承的方式,就可以擁有父類的方法以及屬性,而go中結構體的屬性嵌入組合會相識且更加方便

介面型別

程式碼案例

//這裡 student 就是內部型別
type student struct {
    name string
    email string
}
//people 是外部型別
//通過嵌入型別,與內部型別相關聯的所有欄位、方法、標誌符等等所有,都會被外包型別所擁有,就像外部型別自己的一樣,這就達到了程式碼快捷複用組合的目的,而且定義非常簡單,只需宣告這個型別的名字就可以了。
//同時,外部型別還可以新增自己的方法、欄位屬性等,可以很方便的擴充套件外部型別的功能。
type teacher struct {
    student
    level string
}
func main() {
    tea:=teacher{student{"董雷","donglei@qq.com"},"班長"}
    fmt.Println("可以直接呼叫,名字為:",tea.name)
    fmt.Println("也可以通過內部型別呼叫,名字為:",tea.student.name)
    fmt.Println("但是新增加的屬性只能直接呼叫,級別為:",tea.level)
}
//返回如下
可以直接呼叫,名字為: 董雷
也可以通過內部型別呼叫,名字為: 董雷
但是新增加的屬性只能直接呼叫,級別為: 班長

方法覆蓋的問題

//這裡 student 就是內部型別
type student struct {
    name string
    email string
}
//people 是外部型別
//通過嵌入型別,與內部型別相關聯的所有欄位、方法、標誌符等等所有,都會被外包型別所擁有,就像外部型別自己的一樣,這就達到了程式碼快捷複用組合的目的,而且定義非常簡單,只需宣告這個型別的名字就可以了。
//同時,外部型別還可以新增自己的方法、欄位屬性等,可以很方便的擴充套件外部型別的功能。
type teacher struct {
    student
    level string
}
func (s student) sayHello(){
    fmt.Println("Hello,i am a student")
}
func (t teacher) sayHello(){
    fmt.Println("Hello,i am a teacher")
}
func main() {
    tea:=teacher{student{"董雷","donglei@qq.com"},"班長"}
    //外部結構體物件呼叫方法,會覆蓋子結構體
    tea.sayHello()
    //如果想呼叫子結構體,需要多呼叫一層
    tea.student.sayHello()
}
//返回
Hello,i am a teacher
Hello,i am a student

實現介面

程式碼案例

//這裡 student 就是內部型別
type student struct {
    name string
    email string
}
//people 是外部型別
//通過嵌入型別,與內部型別相關聯的所有欄位、方法、標誌符等等所有,都會被外包型別所擁有,就像外部型別自己的一樣,這就達到了程式碼快捷複用組合的目的,而且定義非常簡單,只需宣告這個型別的名字就可以了。
//同時,外部型別還可以新增自己的方法、欄位屬性等,可以很方便的擴充套件外部型別的功能。
type teacher struct {
    student
    level string
}
//定義一個介面,介面裡面有一個hello抽象方法
type Hello interface {
    hello()
}
//為student結構體註冊方法
func (s student) hello()  {
    fmt.Println("Hello,i am a student")
}
//定義一個通用函式
func sayHello(h Hello)  {
    h.hello()
}
func main() {
    tea:=teacher{student{"董雷","donglei@qq.com"},"班長"}
    sayHello(tea)
}
//返回結果
Hello,i am a student

這個例子原來的結構體型別student和teacher的定義不變,新增了一個介面Hello,然後讓student型別實現這個介面,最後我們定義了一個sayHello方法,它接受一個Hello介面型別的引數,最終我們在main函式演示的時候,發現不管是student型別,還是teacher型別作為引數傳遞給sayHello方法的時候,都可以正常呼叫。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
good good study day day up

相關文章