go語言有乙個特性讓我們只宣告乙個成員對應的資料型別而不指名成員的名字,這類成員就叫匿名成員。匿名成員的資料型別必須是命名的型別或指向乙個命名的型別的指標。
匿名成員
type shape struct
type circle struct
任何型別都可以作為結構體的匿名成員,使用匿名成員不僅可以用簡短的點運算子語法選擇匿名成員巢狀的成員,也可以用於訪問匿名型別的方法集。實際上,外層的結構體不僅僅是獲得了匿名成員型別的所有成員,而且也或得了該型別匯出的全部的方法。這個機制可以用於將乙個有簡單行為的物件組合成有複雜行為的物件。組合是go語言中物件導向程式設計的核心。
匿名成員及其方法
type shape struct
func (p *shape) getshapearea() int
func (s shape) showshapeimage()
type circle struct
func (p *circle) getcircleradius() int
func (c circle)getcirclecolor() int
呼叫
1.嵌入型別為shape
1).結構體型別物件為circle
c := circle{}
c.showshapeimage()
c.getshapearea()
c.getcircleradius()
c.getcirclecolor()
fmt.println(c.data)
執行結果
---------showshapeimage----------
showshapeimage 0
---------getshapearea----------
getshapearea 0 &
---------getcircleradius----------
---------getshapearea----------
getshapearea 20 &
---------showshapeimage----------
showshapeimage 20
---------getcirclecolor----------
---------showshapeimage----------
showshapeimage 20
---------getshapearea----------
getshapearea 20 &
20
2).結構體型別物件為*circle
c := &circle{}
c.showshapeimage()
c.getshapearea()
c.getcircleradius()
c.getcirclecolor()
fmt.println(c.data)
執行結果
---------showshapeimage----------
showshapeimage 0
---------getshapearea----------
getshapearea 0 &
---------getcircleradius----------
---------getshapearea----------
getshapearea 20 &
---------showshapeimage----------
showshapeimage 20
---------getcirclecolor----------
---------showshapeimage----------
showshapeimage 20
---------getshapearea----------
getshapearea 20 &
20
2.嵌入型別為*shape
1).結構體型別物件為circle
c := circle}
c.showshapeimage()
c.getshapearea()
c.getcircleradius()
c.getcirclecolor()
fmt.println(c.data)
執行結果
---------showshapeimage----------
showshapeimage 10
---------getshapearea----------
getshapearea 10 &
---------getcircleradius----------
---------getshapearea----------
getshapearea 20 &
---------showshapeimage----------
showshapeimage 20
---------getcirclecolor----------
---------showshapeimage----------
showshapeimage 20
---------getshapearea----------
getshapearea 20 &
20
2).結構體型別物件為*circle
c := &circle}
c.showshapeimage()
c.getshapearea()
c.getcircleradius()
c.getcirclecolor()
fmt.println(c.data)
執行結果
---------showshapeimage----------
showshapeimage 10
---------getshapearea----------
getshapearea 10 &
---------getcircleradius----------
---------getshapearea----------
getshapearea 20 &
---------showshapeimage----------
showshapeimage 20
---------getcirclecolor----------
---------showshapeimage----------
showshapeimage 20
---------getshapearea----------
getshapearea 20 &
20
總結
不管 circle 中包含了乙個嵌入型別 *shape或是shape,那麼 circle 和 *circle 的方法集合中都會包含接收者型別為 shape 和 *shape 的所有方法,只是嵌入型別如果是*shape的話,在使用時需要將*shape初始化(也就是賦值),不然呼叫在呼叫shape的方法時會直接報錯,呼叫*shape的方法時,如果使用到接收者*shape物件也會報錯。
所以個人感覺結構體的資料量過大時,在使用嵌入型別時應盡量使用非指標型別,而嵌入型別的方法集應使用基於指標物件的方法
方法覆蓋
如果我們給*circle/circle再新增乙個與*shape/shape方法名相同的方法,那麼*shape/shape的方法就會被*circle/circle的方法覆蓋,因為go語言沒有方法過載,所以編譯器認為只要是方法名相同就會被覆蓋,而不是方法的簽名,這裡不僅僅只有方法才能覆蓋方法,方法也可以覆蓋成員變數,只要名字相同就可以覆蓋,成員變數也可以覆蓋方法。
func (c *circle) getshapearea()
c := &circle}
c.getshapearea()
執行結果:
-------*circle--getshapearea----------
Go語言之嵌入型別
嵌入型別,或者巢狀型別,這是一種可以把已有的型別宣告在新的型別裡的一種方式,這種功能對 復用非常重要。在其他語言中,有繼承可以做同樣的事情,但是在go語言中,沒有繼承的概念。go提倡的 復用的方式是組合,所以這也是嵌入型別的意義所在。組合而不是繼承,所以go才會更靈活。type reader int...
Array型別及其常用的方法
array型別可以說算是 js 中最常用的型別了,在ecmscript中的陣列和其他型別語言中的陣列有著很大的區別。ecmscript中的陣列的每一項可以儲存任何型別的資料,也就是陣列的第一項可以是字串,第二項可以是數字。而且ecmscript中的陣列是可以進行動態調整的,可以隨著資料的增加自動調整...
go 型別方法 receiver的理解
package main import fmt type person struct func this person growth func this person changename newname string func main p.growth fmt.printf d p.age 因為...