欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Go36-14-接口-創(chuàng)新互聯(lián)

接口

通過關(guān)鍵字type和interface,我們可以聲明出接口類型。接口類型的類型字面量與結(jié)構(gòu)體類型的看起來有些相似,它們都用花括號包裹一些核心信息。只不過,結(jié)構(gòu)體類型包裹的是它的字段聲明,而接口類型包裹的是它的方法定義。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供蕭縣網(wǎng)站建設(shè)、蕭縣做網(wǎng)站、蕭縣網(wǎng)站設(shè)計(jì)、蕭縣網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、蕭縣企業(yè)網(wǎng)站模板建站服務(wù),10年蕭縣做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

實(shí)現(xiàn)接口

接口類型聲明中的這些方法所代表的就是該接口的方法集合。一個(gè)接口的方法集合就是它的全部特征。對于任何數(shù)據(jù)類型,只要它的方法集合中完全包含了一個(gè)接口的全部特征(即全部的方法),那么它就一定是這個(gè)接口的實(shí)現(xiàn)類型:

type Pet interface {
    SetName(name string)
    Name() string
    Category() string
}

這里聲明了一個(gè)接口類型Pet,它包含3個(gè)方法定義。這3個(gè)方法共同組成了接口類型Pet的方法集合。只要一個(gè)數(shù)據(jù)類型的方法集合中有3個(gè)方法,那么它就就一定是Pet接口類型的實(shí)現(xiàn)。這是一種無浸入式的接口實(shí)現(xiàn)方式。這種方式還有一個(gè)專有名詞,叫“Duck typing”,中文常譯作“鴨子類型”。
下面的是上一篇結(jié)尾的那個(gè)例子,不過Cat換成了Dog:

package main

import "fmt"

type Pet interface {
    SetName(name string)
    Name() string
    Category() string
}

type Dog struct {
    name string // 名字。
}

func (dog *Dog) SetName(name string) {
    dog.name = name
}

func (dog Dog) Name() string {
    return dog.name
}

func (dog Dog) Category() string {
    return "dog"
}

func main() {
    // 示例1。
    dog := Dog{"little pig"}
    _, ok := interface{}(dog).(Pet)
    fmt.Printf("Dog implements interface Pet: %v\n", ok)
    _, ok = interface{}(&dog).(Pet)
    fmt.Printf("*Dog implements interface Pet: %v\n", ok)
    fmt.Println()

    // 示例2。
    var pet Pet = &dog
    fmt.Printf("This pet is a %s, the name is %q.\n",
        pet.Category(), pet.Name())
}

聲明的Dog有3個(gè)方法,其中2個(gè)是值方法Name和Category,還有一個(gè)指針方法SetName。Dog類型本身的方法集合中只有2個(gè)方法,就是所有的值方法。而它的指針類型*Dog方法集合包含了3個(gè)方法,就是它擁有Dog類型附帶的所有值方法和指針方法。而這3個(gè)方法正好是Pet接口中,所以*Dog類型就成為了Pet接口的實(shí)現(xiàn)類型。
在上面,示例2的那一小段代碼,把main主函數(shù)開頭聲明的Dog類型的變量dog,把它的指針賦值給了類型為Pet的變量pet。這里的變量pet的值,可以被叫做它的實(shí)際值(也稱動(dòng)態(tài)值)。該值的類型可以被叫做這個(gè)表量的實(shí)際類型(也稱動(dòng)態(tài)類型)。
動(dòng)態(tài)類型的叫法是相對于靜態(tài)類型而言的。對于變量pet,它的靜態(tài)類型就是Pet,并且不會(huì)改變。但是他的動(dòng)態(tài)會(huì)隨著賦給他的動(dòng)態(tài)值而變化。這里的動(dòng)態(tài)類型是*Dog類型,而動(dòng)態(tài)值就是&dog的值(就是dog的地址)。

給接口賦值

下面的示例定義了簡單的結(jié)構(gòu)體和接口類型:

package main

import "fmt"

type Pet interface {
    Name() string
}

type Dog struct {
    name string
}

// 如果這是一個(gè)值方法?
func (d *Dog) SetName (name string) {
    d.name = name
}

func (d Dog) Name() string {
    return d.name
}

func main() {
    dog := Dog{"Snoopy"}
    fmt.Println(dog.Name())
    var pet Pet = dog  // 這個(gè)如果是一個(gè)取址表達(dá)式?
    dog.SetName("Goofy ")
    fmt.Println(dog.Name())
    fmt.Println(pet.Name())
}

這里的SetName方法必須是指針方法。因?yàn)槿绻侵捣椒?,接受者就是dog的副本,該方法改變的也只是副本的name的值,不會(huì)影響的dog變量本身。如果是指針方法,那么當(dāng)SetName方法執(zhí)行后,dog的name字典就就被改變了。
然后接著看接下來的一層。dog賦值給了pet,然后dog的name字段確實(shí)變了,但是這里pet里還是原來的值。這里的原因和上面的一樣的。如果使用一個(gè)變量給另外一個(gè)變量賦值,那么真正賦值給后者的,其實(shí)是一個(gè)副本。這里如果是把&dog賦值給pet,那么pet的值也就會(huì)跟著dog的進(jìn)行變化了。
上面可以這么理解,但是嚴(yán)格來講,即使像前面那樣把dog的值賦給了pet,pet的值與dog的值也是不同的。在給一個(gè)接口變量賦值的時(shí)候,該變量的動(dòng)態(tài)類型會(huì)與它的動(dòng)態(tài)值一起被存儲(chǔ)在一個(gè)專用的數(shù)據(jù)結(jié)構(gòu)中。無論從存儲(chǔ)的內(nèi)容還是存儲(chǔ)的結(jié)構(gòu)來看,pet的值與dog的值都是不同的。不過可以認(rèn)為,此時(shí)的pet的值中包含了dog的值的副本。

接口變量的nil值

這里要討論的是接口變量在聲明情況下才真正為nil:

package main

import "fmt"

type Pet interface {
    Name() string
}

type Dog struct {
    name string
}

func (d Dog) Name() string {
    return d.name
}

func main() {
    var dog *Dog
    fmt.Println(dog)
    fmt.Println(dog == nil)  // true
    var pet Pet = dog
    // var pet Pet = nil  // 注釋掉上面的,試試這句
    fmt.Println(pet)
    fmt.Println(pet == nil)  // false
    // fmt.Printf("%T", pet)  // 打印動(dòng)態(tài)類型

這里先聲明了一個(gè)*Dog類型的變量dog,并沒有對他進(jìn)行初始化。所以它的值就是nil。
然后把dog賦值給了接口類型pet,此時(shí)判斷pet是否為nil時(shí)返回的false。
這里確實(shí)把值為nil的dog變量賦值給了pet。pet的動(dòng)態(tài)值也確實(shí)是nil,但是pet的值不是nil。動(dòng)態(tài)值只是pet值的一部分,還有動(dòng)態(tài)類型。pet的動(dòng)態(tài)類型是*Dog,可以通過fmt.Printf函數(shù)和占位符%T打印變量的類型。另外reflect包的TypeOf函數(shù)也可以起到類似的作用。
如果把nil直接賦值給pet的話,那么pet就是真正的nil了。在Go語言里,字面量nil表示的值叫做無類型的nil。這個(gè)是真正的nil,因?yàn)樗念愋鸵彩莕il。而例子中,雖然dog的值是nil,但是當(dāng)把這個(gè)變量賦值pet的時(shí)候,其實(shí)是賦值給pet的值是一個(gè)*Dog類型的nil值。對于接口變量,需要?jiǎng)討B(tài)值和動(dòng)態(tài)類型都是nil,那才是真正的nil。要想讓一個(gè)接口變量的值真正為nil,可以把一個(gè)字面的nil賦值給它,或者只聲明接口而不做初始化也可以。

接口的組合

接口類型的間的嵌入也被稱為接口的組合。組合的接口之間不能有同名的方法存在,如果有同名的方法就會(huì)產(chǎn)生沖突而無法通過編譯。與結(jié)構(gòu)體類型間的嵌入很相似,只要把一個(gè)接口類型的名稱直接寫的另一個(gè)接口類型的成員列表中就可以進(jìn)行組合:

type Animal interface {
    ScientificName() string
    Category() string
}

type Pet interface {
    Animal
    Name() string
}

組合后,Animal接口包含的所有方法也就是成為了Pet接口的方法。
Go語言團(tuán)隊(duì)鼓勵(lì)我們聲明體量較小的接口,并建議我們通過這種接口間的組合來擴(kuò)展程序、增加程序的靈活性。相比于包含很多方法的大接口而言,小接口可以更加專注地表達(dá)某一種能力或某一類特征,同時(shí)也更容易被組合在一起。善用接口組合和小接口可以讓你的程序框架更加穩(wěn)定和靈活。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站標(biāo)題:Go36-14-接口-創(chuàng)新互聯(lián)
分享路徑:http://aaarwkj.com/article2/deoeoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、網(wǎng)站排名、網(wǎng)頁設(shè)計(jì)公司網(wǎng)站制作、企業(yè)建站、App設(shè)計(jì)

廣告

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

成都網(wǎng)頁設(shè)計(jì)公司
久久精品中文字幕人妻| 日本精品1区国产精品| 国产精品国产一级国产av| 日韩黄色大片免费在线观看| 亚洲午夜激情免费试看| 日韩大片一区二区三区在线观看| 国产三级久久精品三级91| 天天操天天干夜夜骑| 国产传媒在线视频观看| 熟女少妇a一区二区三区| 亚洲视频欧美视频自拍偷拍| 国产三级成人在线视频| 午夜福利视频欧美成人| 久久精品国产精油按摩| 毛片精品一区二区二区三区| 高潮国产精品一区二区| 日韩精品福利片午夜免费| 在线观看中文字幕一区| 久久99热最新地址获取| 国产亚洲加勒比久久精品| 六月综合激情丁香婷婷色| 欧美乱码中文字幕在线观看| 97在线观看全部视频| 欧美人妻不卡一区二区久久| 亚洲欧美日韩一区中文天国| 日韩精品毛片一区到三区| 台湾三级一区二区三区| 嫩草网站国产精品一区二| 一区二区三区人妻日韩| 国产亚洲精品视频免费| 最新91熟女九色地址| 欧美精品亚洲精品日韩| 国产剧情av一区在线观看| 蜜臀视频网站在线观看| 国产成年人拍拍免费视频| 国产三级亚洲三级在线理论| 视频一区二区三区不卡| 久久夜色精品国产高清不卡| 亚洲华人在线免费视频| 日韩精品中文女同在线播放| 91老熟女露脸大合集|