91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言之嵌入類型

發布時間:2020-07-19 04:43:20 來源:網絡 閱讀:381 作者:baby神 欄目:編程語言

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


在其他語言中,有繼承可以做同樣的事情,但是在Go語言中,沒有繼承的概念。Go提倡的代碼復用的方式是組合,所以這也是嵌入類型的意義所在。組合而不是繼承,所以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接口而組合成的新接口,這樣我們就不用重復地定義被嵌入接口里的方法,直接通過嵌入就可以了。嵌入類型同樣適用于結構體類型,我們再來看個例子:


type user struct {
    name string
    email string

}

type admin struct {
    user
    level string
}


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


通過嵌入類型,與內部類型相關聯的所有字段、方法、標志符等,都會被外包類型所擁有。就像外部類型自己的一樣,這就達到了代碼快捷復用組合的目的,而且定義非常簡單,只需聲明這個類型的名字就可以了。


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


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


以上是嵌入類型的使用。可以看到,我們在初始化的時候,采用的是字面值的方式。所以要按其定義的結構進行初始化,先初始化user這個內部類型的,再初始化新增的level 屬性。


對于內部類型的屬性和方法訪問,我們可以用外部類型直接訪問,也可以通過內部類型進行訪問;但是我們為外部類型新增的方法屬性字段,只能使用外部類型訪問,因為內部類型沒有這些。


當然,外部類型也可以聲明同名的字段或者方法,來覆蓋內部類型的,這種情況方法比較多,我們以方法為例。


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


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


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


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


嵌入類型的強大,還體現在:如果內部類型實現了某個接口,那么外部類型也被認為實現了這個接口。我們稍微改造下例子看下。


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


type Hello interface {
    hello()
}

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

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


這個例子原來的結構體類型useradmin的定義不變,新增了一個接口Hello,然后讓user類型實現這個接口,最后我們定義了一個sayHello方法,它接受一個Hello接口類型的參數。最終我們在main函數演示的時候,發現不管是user類型,還是admin類型作為參數傳遞給sayHello方法的時候,都可以正常調用。


這里就可以說明admin實現了接口Hello。但是我們又沒有顯示聲明類型admin實現,所以這個實現是通過內部類型user實現的;因為admin包含了user所有的方法函數,所以也就實現了接口Hello


當然外部類型也可以重新實現,只需要像上面例子一樣覆蓋同名的方法即可。這里要說明的是,不管我們如何同名覆蓋,都不會影響內部類型,我們還可以通過訪問內部類型來訪問它的方法、屬性字段等。


嵌入類型的定義,是Go為了方便我們擴展或者修改已有類型的行為,是為了宣傳組合這個概念而設計的,所以我們經常使用組合,靈活運用組合,擴展出更多的我們需要的類型結構


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蒙自县| 交城县| 中西区| 天祝| 云和县| 肇源县| 融水| 广元市| 睢宁县| 噶尔县| 遂昌县| 嘉鱼县| 辽中县| 马关县| 寻乌县| 隆安县| 长宁县| 厦门市| 永兴县| 体育| 泗水县| 宜黄县| 金寨县| 崇信县| 乾安县| 宜黄县| 喀喇沁旗| 济宁市| 高邑县| 顺平县| 太康县| 三穗县| 沂南县| 武陟县| 通山县| 浮山县| 玉环县| 河东区| 通海县| 琼结县| 广宁县|