Go語言實戰(zhàn)筆記(十)| Go 嵌入類型

《Go語言實戰(zhàn)》讀書筆記险绘,未完待續(xù),歡迎掃碼關(guān)注公眾號flysnow_org椎椰,第一時間看后續(xù)筆記。

嵌入類型沾鳄,或者嵌套類型俭识,這是一種可以把已有的類型聲明在新的類型里的一種方式,這種功能對代碼復(fù)用非常重要洞渔。

在其他語言中茫藏,有繼承可以做同樣的事情柏蘑,但是在Go語言中白华,沒有繼承的概念杏糙,Go提倡的代碼復(fù)用的方式是組合,所以這也是嵌入類型的意義所在浆熔,組合而不是繼承本辐,所以Go才會更靈活。

type Reader interface {
    Read(p []byte) (n int, err error)
}

type Writer interface {
    Write(p []byte) (n int, err error)
}

type Closer interface {
    Close() error
}


type ReadWriter interface {
    Reader
    Writer
}

type ReadCloser interface {
    Reader
    Closer
}

type WriteCloser interface {
    Writer
    Closer
}

以上是標準庫io包里医增,我們常用的接口慎皱,可以看到ReadWriter接口是嵌入ReaderReader接口而組合成的新接口,這樣我們就不用重復(fù)的定義被嵌入接口里的方法叶骨,直接通過嵌入就可以了茫多。嵌入類型同樣適用于結(jié)構(gòu)體類型,我們再來看個例子:

type user struct {
    name string
    email string

}

type admin struct {
    user
    level string
}

嵌入后忽刽,被嵌入的類型稱之為內(nèi)部類型天揖、新定義的類型稱之為外部類型,這里user就是內(nèi)部類型跪帝,而admin是外部類型今膊。

通過嵌入類型,與內(nèi)部類型相關(guān)聯(lián)的所有字段伞剑、方法斑唬、標志符等等所有,都會被外包類型所擁有黎泣,就像外部類型自己的一樣恕刘,這就達到了代碼快捷復(fù)用組合的目的,而且定義非常簡單聘裁,只需聲明這個類型的名字就可以了雪营。

同時弓千,外部類型還可以添加自己的方法衡便、字段屬性等,可以很方便的擴展外部類型的功能。

func main() {
    ad:=admin{user{"張三","zhangsan@flysnow.org"},"管理員"}
    fmt.Println("可以直接調(diào)用,名字為:",ad.name)
    fmt.Println("也可以通過內(nèi)部類型調(diào)用,名字為:",ad.user.name)
    fmt.Println("但是新增加的屬性只能直接調(diào)用镣陕,級別為:",ad.level)
}

以上是嵌入類型的使用谴餐,可以看到,我們在初始化的時候呆抑,采用的是字面值的方式岂嗓,所以要按其定義的結(jié)構(gòu)進行初始化,先初始化user這個內(nèi)部類型的鹊碍,再初始化新增的level 屬性厌殉。

對于內(nèi)部類型的屬性和方法訪問上,我們可以用外部類型直接訪問侈咕,也可以通過內(nèi)部類型進行訪問公罕;但是我們?yōu)橥獠款愋托略龅姆椒▽傩宰侄危荒苁褂猛獠款愋驮L問耀销,因為內(nèi)部類型沒有這些楼眷。

當然,外部類型也可以聲明同名的字段或者方法熊尉,來覆蓋內(nèi)部類型的罐柳,這種情況方法比較多,我們以方法為例

func main() {
    ad:=admin{user{"張三","zhangsan@flysnow.org"},"管理員"}
    ad.user.sayHello()
    ad.sayHello()
}

type user struct {
    name string
    email string

}

type admin struct {
    user
    level string
}

func (u user) sayHello(){
    fmt.Println("Hello狰住,i am a user")
}

func (a admin) sayHello(){
    fmt.Println("Hello张吉,i am a admin")
}

內(nèi)部類型user有一個sayHello方法,外部類型對其進行了覆蓋催植,同名重寫sayHello芦拿,然后我們在main方法里分別訪問這兩個類型的方法,打印輸出:

Hello查邢,i am a user
Hello蔗崎,i am a admin

從輸出中看,方法sayHello被成功覆蓋了扰藕。

嵌入類型的強大缓苛,還體現(xiàn)在:如果內(nèi)部類型實現(xiàn)了某個接口,那么外部類型也被認為實現(xiàn)了這個接口邓深。我們稍微改造下例子看下未桥。

func main() {
    ad:=admin{user{"張三","zhangsan@flysnow.org"},"管理員"}
    sayHello(ad.user)//使用user作為參數(shù)
    sayHello(ad)//使用admin作為參數(shù)
}


type Hello interface {
    hello()
}

func (u user) hello(){
    fmt.Println("Hello,i am a user")
}

func sayHello(h Hello){
    h.hello()
}

這個例子原來的結(jié)構(gòu)體類型useradmin的定義不變芥备,新增了一個接口Hello,然后讓user類型實現(xiàn)這個接口冬耿,最后我們定義了一個sayHello方法,它接受一個Hello接口類型的參數(shù)萌壳,最終我們在main函數(shù)演示的時候亦镶,發(fā)現(xiàn)不管是user類型日月,還是admin類型作為參數(shù)傳遞給sayHello方法的時候,都可以正常調(diào)用缤骨。

這里就可以說明admin實現(xiàn)了接口Hello,但是我們又沒有顯示的聲明類型admin實現(xiàn)爱咬,所以這個實現(xiàn)是通過內(nèi)部類型user實現(xiàn)的,因為admin包含了user所有的方法函數(shù)绊起,所以也就實現(xiàn)了接口Hello精拟。

當然外部類型也可以重新實現(xiàn),只需要像上面例子一樣覆蓋同名的方法即可虱歪。這里要說明的是蜂绎,不管我們?nèi)绾瓮采w,都不會影響內(nèi)部類型笋鄙,我們還可以通過訪問內(nèi)部類型來訪問它的方法荡碾、屬性字段等。

嵌入類型的定義局装,是Go為了方便我們擴展或者修改已有類型的行為坛吁,是為了宣傳組合這個概念而設(shè)計的,所以我們經(jīng)常使用組合铐尚,靈活運用組合拨脉,擴展出更多的我們需要的類型結(jié)構(gòu)。

《Go語言實戰(zhàn)》讀書筆記宣增,未完待續(xù)玫膀,歡迎掃碼關(guān)注公眾號flysnow_org,第一時間看后續(xù)筆記爹脾。

掃碼關(guān)注
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帖旨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子灵妨,更是在濱河造成了極大的恐慌解阅,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泌霍,死亡現(xiàn)場離奇詭異货抄,居然都是意外死亡,警方通過查閱死者的電腦和手機朱转,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門蟹地,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人藤为,你說我怎么就攤上這事怪与。” “怎么了缅疟?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵分别,是天一觀的道長遍愿。 經(jīng)常有香客問我,道長茎杂,這世上最難降的妖魔是什么错览? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任纫雁,我火速辦了婚禮煌往,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轧邪。我一直安慰自己刽脖,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布忌愚。 她就那樣靜靜地躺著曲管,像睡著了一般。 火紅的嫁衣襯著肌膚如雪硕糊。 梳的紋絲不亂的頭發(fā)上院水,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音简十,去河邊找鬼檬某。 笑死,一個胖子當著我的面吹牛螟蝙,可吹牛的內(nèi)容都是我干的恢恼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胰默,長吁一口氣:“原來是場噩夢啊……” “哼场斑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牵署,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤漏隐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奴迅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锁保,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年半沽,在試婚紗的時候發(fā)現(xiàn)自己被綠了爽柒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡者填,死狀恐怖浩村,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情占哟,我是刑警寧澤心墅,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布酿矢,位于F島的核電站,受9級特大地震影響怎燥,放射性物質(zhì)發(fā)生泄漏瘫筐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一铐姚、第九天 我趴在偏房一處隱蔽的房頂上張望策肝。 院中可真熱鬧,春花似錦隐绵、人聲如沸之众。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棺禾。三九已至,卻和暖如春峭跳,著一層夾襖步出監(jiān)牢的瞬間膘婶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工蛀醉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悬襟,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓滞欠,卻偏偏與公主長得像古胆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子筛璧,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容