Go語(yǔ)言之嵌入類型

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

創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái),是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元新興做網(wǎng)站,已為上家服務(wù),為新興各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575


在其他語(yǔ)言中,有繼承可以做同樣的事情,但是在Go語(yǔ)言中,沒(méi)有繼承的概念。Go提倡的代碼復(fù)用的方式是組合,所以這也是嵌入類型的意義所在。組合而不是繼承,所以Go才會(huì)更靈活。


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
}


以上是標(biāo)準(zhǔn)庫(kù)io包里我們常用的接口,可以看到ReadWriter接口是嵌入ReaderReader接口而組合成的新接口,這樣我們就不用重復(fù)地定義被嵌入接口里的方法,直接通過(guò)嵌入就可以了。嵌入類型同樣適用于結(jié)構(gòu)體類型,我們?cè)賮?lái)看個(gè)例子:


type user struct {
    name string
    email string

}

type admin struct {
    user
    level string
}


嵌入后,被嵌入的類型稱之為內(nèi)部類型,新定義的類型稱之為外部類型。這里user就是內(nèi)部類型,而admin是外部類型。


通過(guò)嵌入類型,與內(nèi)部類型相關(guān)聯(lián)的所有字段、方法、標(biāo)志符等,都會(huì)被外包類型所擁有。就像外部類型自己的一樣,這就達(dá)到了代碼快捷復(fù)用組合的目的,而且定義非常簡(jiǎn)單,只需聲明這個(gè)類型的名字就可以了。


同時(shí),外部類型還可以添加自己的方法、字段屬性等,可以很方便地?cái)U(kuò)展外部類型的功能。


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


以上是嵌入類型的使用??梢钥吹?,我們?cè)诔跏蓟臅r(shí)候,采用的是字面值的方式。所以要按其定義的結(jié)構(gòu)進(jìn)行初始化,先初始化user這個(gè)內(nèi)部類型的,再初始化新增的level 屬性。


對(duì)于內(nèi)部類型的屬性和方法訪問(wèn),我們可以用外部類型直接訪問(wèn),也可以通過(guò)內(nèi)部類型進(jìn)行訪問(wèn);但是我們?yōu)橥獠款愋托略龅姆椒▽傩宰侄?,只能使用外部類型訪問(wèn),因?yàn)閮?nèi)部類型沒(méi)有這些。


當(dāng)然,外部類型也可以聲明同名的字段或者方法,來(lá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有一個(gè)sayHello方法,外部類型對(duì)其進(jìn)行了覆蓋,同名重寫sayHello,然后我們?cè)趍ain方法里分別訪問(wèn)這兩個(gè)類型的方法,打印輸出:


Hello,i am a user
Hello,i am a admin


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


嵌入類型的強(qiáng)大,還體現(xiàn)在:如果內(nèi)部類型實(shí)現(xiàn)了某個(gè)接口,那么外部類型也被認(rèn)為實(shí)現(xiàn)了這個(gè)接口。我們稍微改造下例子看下。


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()
}


這個(gè)例子原來(lái)的結(jié)構(gòu)體類型useradmin的定義不變,新增了一個(gè)接口Hello,然后讓user類型實(shí)現(xiàn)這個(gè)接口,最后我們定義了一個(gè)sayHello方法,它接受一個(gè)Hello接口類型的參數(shù)。最終我們?cè)趍ain函數(shù)演示的時(shí)候,發(fā)現(xiàn)不管是user類型,還是admin類型作為參數(shù)傳遞給sayHello方法的時(shí)候,都可以正常調(diào)用。


這里就可以說(shuō)明admin實(shí)現(xiàn)了接口Hello。但是我們又沒(méi)有顯示聲明類型admin實(shí)現(xiàn),所以這個(gè)實(shí)現(xiàn)是通過(guò)內(nèi)部類型user實(shí)現(xiàn)的;因?yàn)?code>admin包含了user所有的方法函數(shù),所以也就實(shí)現(xiàn)了接口Hello


當(dāng)然外部類型也可以重新實(shí)現(xiàn),只需要像上面例子一樣覆蓋同名的方法即可。這里要說(shuō)明的是,不管我們?nèi)绾瓮采w,都不會(huì)影響內(nèi)部類型,我們還可以通過(guò)訪問(wèn)內(nèi)部類型來(lái)訪問(wèn)它的方法、屬性字段等。


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

新聞標(biāo)題:Go語(yǔ)言之嵌入類型
轉(zhuǎn)載源于:http://muchs.cn/article34/gpphpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、軟件開(kāi)發(fā)、網(wǎng)站營(yíng)銷、做網(wǎng)站、App設(shè)計(jì)、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)