golang也提供了繼承機制,但採用組合的文法,所以稱爲匿名組合。與其餘語言不一樣, golang很清晰地展現出類的內存佈局是怎樣的。golang
一 非指針方式的組合函數
1)基本語法佈局
type base struct{ //成員變量 } func(b *base) 函數名(參數列表)(返回值列表){ //函數體 } //派生類 type derived struct{ base //成員變量 } func (b *derived) 函數名(參數列表)(返回值列表){ //函數體 }
2)繼承規則spa
√ 在派生類沒有改寫基類的成員方法時,相應的成員方法被繼承。指針
√ 派生類能夠直接調用基類的成員方法,譬如基類有個成員方法爲Base.Func(),那麼Derived.Func()等同於Derived.Base.Func()blog
√ 假若派生類的成員方法名與基類的成員方法名相同,那麼基類方法將被覆蓋或叫隱藏,譬如基類和派生類都有成員方法Func(),那麼Derived.Func()將只能調用派生類的Func()方法,若是要調用基類版本,能夠經過Derived.Base.Func()來調用。繼承
舉例以下:內存
package main import "fmt" type Base struct{ //成員變量 } func(b *Base) Func1(){ fmt.Println("Base.Func1 was invoked1") } func(b *Base) Func2(){ fmt.Println("Base.Func2 was invoked1") } //派生類 type Derived struct{ Base //成員變量 } func (d *Derived) Func2(){ fmt.Println("Derived.Func2() was invoked!") } func (d *Derived) Func3(){ fmt.Println("Derived.Func3() was invoked!") } func main(){ d:=&Derived{} d.Func1() d.Base.Func1() d.Func2() d.Base.Func2() d.Func3() }
二 指針組合模式class
基本語法:import
/ 基類 type Base struct { // 成員變量 } func (b *Base) 函數名(參數列表) (返回值列表) { // 函數體 } // 派生類 type Derived struct { *Base // 成員變量 } func (b *Derived) 函數名(參數列表) (返回值列表) { // 函數體 }