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 協議》,轉載必須註明作者和本文連結