Golang的方法集繼承規則示例

  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

相關文章
相關標籤/搜索