Golang的方法集繼承規則示例函數
2016/11/11 · Go · Golang, IT技術性能
分享到:0MongoDB集羣之分片技術應用MongoDB複製集—快速搭建複製集MongoDB複製集技術內幕:工做原理及新版本改進方向MongoDB 在線講座之如何測試、調整及監控MongoDB性能本文做者: 伯樂在線 - v7 。未經做者許可,禁止轉載!測試
歡迎加入伯樂在線 專欄做者。url
本篇經過具體示例來展示 Golang 機制中 methods set 的繼承規則。.net
0x00 簡單method的規則3d
首先,咱們聲明示例的基本操做結構體。指針
更多閱讀請點擊:鄭州治療白癜風醫院blog
更多閱讀請點擊:鄭州治療牛皮癬醫院繼承
Go接口
1
2
3
4type Cat struct{
Name string
Color string
}
咱們聲明瞭一個 Cat 的 type,在它的基礎上咱們聲明一個Meow的method:
Go
1
2
3func (c Cat) Meow() {
fmt.Println("Name:", c.Name, "Color:", c.Color)
}
在上面的代碼上, 咱們聲明瞭一個method, 它的receiver是Cat(區別於Cat的指針),在這時,不管是咱們經過 Cat類型的變量來調用method仍是用 *Cat的類型來調用,Go都會正常的編譯並正常輸出,以下圖:
如圖,main函數中的 a 和 b 變量,一個是 Cat 類型,一個是Cat的指針類型,他們都有Meow方法。
那麼若是咱們聲明的函數receiver是 *Cat呢?
1
2
3func (c *Cat) Meow() {
fmt.Println("Name:", c.Name, "Color:", c.Color)
}
在這種狀況下,方法也是繼承的:
上面是簡單的 Cat 和 *Cat 上的方法集的繼承規則:
普通狀況下,類型 T 和 *T 上的方法集是互相繼承的。
0x01 接口中methods set的規則
接下來咱們聲明一個接口來作對比:
1
2
3
4
5
6
7
8type Meower interface{
Meow()
}
func Greet(meower Meower){
meower.Meow()
}
首先咱們在Cat類型上實現Meower接口:
1
2
3func (c Cat) Meow(){
fmt.Println("Name:", c.Name, " Color:", c.Color)
}
此時編譯是沒問題的
也就是說,若是咱們給Cat類型實現Meower的接口上Meow的方法,不管是Cat仍是*Cat都是能夠成爲接口調用的。
那若是咱們實現接口方式時候,選擇的receiver是*Cat呢?
1
2
3func (c *Cat) Meow(){
fmt.Println("Name:", c.Name, " Color:", c.Color)
}
編譯不經過,以下圖:
若是給指針實現Meow方法,在第26行出現了類型錯誤,提示咱們Meow方法的receiver是一個指針類型,說明此時方法不能繼承。
因而這裏的規則是:
在接口中的method,對於普通類型T:
T的methods set裏不會繼承包含*T實現的method,除非T本身實現相對應的method。
可是,*T會繼承T的method set。
0x02 嵌入類型中methods set的規則
咱們討論了上面兩種狀況,那考慮若是Cat做爲嵌入類型(Embedded Types)時會發生什麼呢?
因而在上面的基礎上,咱們來聲明這樣一個類型來作實驗:
1
2
3
4type BlackCat struct{
Cat
Age int
}
此時咱們是直接能夠經過BlackCat 來調用Cat實現的接口method的, 如圖:
上圖中,咱們並無爲BlackCat實現接口,僅僅爲Cat實現了接口,不過BlackCat裏面嵌入了Cat的一個內部類型,也是能夠經過接口調用函數Greet來調用到Meow method。
同時咱們修改main函數,發現BlackCat的methods set 裏面包含了Meow(), 以下圖:
此時:
嵌入類型的類型中,外部類型本身不曾實現的methods被攜帶的內部函數實現時,外部類型也會將這些methods加入到本身的methods set裏。
那麼,若是外部類型BlackCat本身實現了Meow()函數(同時也實現了接口),內部和外部都實現的狀況下會怎樣呢?
下面咱們給BlackCat實現Meow()方法試一下:
1
2
3func (c BlackCat) Meow(){
fmt.Println("BlackName:", c.Cat.Name, " Age:", c.Age)
}
首先,編譯是沒問題的:
咱們看一下a.Cat.Meow() 和 a.Meow()的運行結果:
發現BlackCat的使用了本身實現的方法,或者說它把內部Cat的Meow()方法覆蓋了。
將直接調用改爲使用接口時也是如此:
兩次結果是同樣的。
0x03 結論
搞清Golang中的方法集繼承對咱們寫出不囉嗦的代碼頗有用處,而在Golang中,對於指針的處理也比C/C++中靈活了一些。
0x04 參考資料
Methods, Interfaces and Embedded Types in Go