欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2022年07月12日 16:20:46   作者:奮斗的大橙子  
本文詳細(xì)講解了Go語(yǔ)言之嵌入類型,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、什么是嵌入類型

先看如下代碼:

type user struct {
    name string
    email string
}

type admin struct {
    user // Embedded Type
    level string
}

可以看到admin結(jié)構(gòu)中的一個(gè)成員是user,那么admin中就嵌入了user類型。

  • admin也叫做外部類型
  • user也叫做內(nèi)部類型

二、外部類型和內(nèi)部類型之間的關(guān)系和機(jī)制

func (u *user) notify() {
    fmt.Printf("Sending user email to %s<%s>\n",
        u.name,
        u.email)
}

如上代碼,實(shí)現(xiàn)了一個(gè)方法notify(),接收者是 *user。

func main() {
    // Create an admin user.
    ad := admin{
        user: user{
            name: "john smith",
            email: "john@yahoo.com",
        },
        level: "super",
    }
    // We can access the inner type's method directly.
    ad.user.notify()
    // The inner type's method is promoted.
    ad.notify()
}

main函數(shù)中定義了一個(gè)變量ad,并且進(jìn)行了賦值

運(yùn)行:

Sending user email to john smith<john@yahoo.com>
Sending user email to john smith<john@yahoo.com>

①?zèng)]有編譯錯(cuò)誤

②notify()可以被ad.user調(diào)用是可以理解的,但是ad.notify()也能執(zhí)行是為什么。

這里涉及到了一個(gè)嵌入類型背后的機(jī)制,內(nèi)部類型提升 (感覺(jué)有點(diǎn)像C#、Java里面的繼承,user是父類,admin是子類,admin的實(shí)例對(duì)象直接調(diào)用了父類的notify方法。)

進(jìn)一步研究:我們?cè)俣x一個(gè)接口、以及一個(gè)接受該接口的函數(shù)。

接口,只有一個(gè)方法notify

type notifier interface {
    notify()
}

函數(shù),接受一個(gè)實(shí)現(xiàn)notifier接口的類型實(shí)例,內(nèi)部就是調(diào)用notify方法

func sendNotification(n notifier) {
    n.notify()
}

main方法如下

func main() {
    // Create an admin user.
    ad := admin{
        user: user{
            name: "john smith",
            email: "john@yahoo.com",
        },
        level: "super",
    }
    
    var user = ad.user
    sendNotification(&user)

    sendNotification(&ad)
}

運(yùn)行結(jié)果:

Sending user email to john smith<john@yahoo.com>
Sending user email to john smith<john@yahoo.com>

①可以看到這里傳入 &user和&ad都是可以的,說(shuō)明類型提升導(dǎo)致admin也是實(shí)現(xiàn)了notifier接口了。

②為什么穿&user和&ad,而不是直接傳user和ad,這就涉及到了之前總結(jié)過(guò)的【方法集】的概念了。復(fù)習(xí)一下:

從上面兩個(gè)表,可以知道由于方法的接收者是 *user ,所以說(shuō)只有*user實(shí)現(xiàn)了該接口的方法,這就是為什么輸入&user、&ad了

再進(jìn)一步研究:我們?cè)贑#當(dāng)中,如果使用了virtual作為修飾符在父類中寫(xiě)了一個(gè)方法,那么在子類中通過(guò)override可以重寫(xiě)這個(gè)方法,最終的結(jié)果就是調(diào)用的非父類的該方法,而是子類的,Go語(yǔ)言同樣可以。

例如

// 通過(guò)admin 類型值的指針
// 調(diào)用的方法
func (a *admin) notify() {
   fmt.Printf("Sending admin email to %s<%s>\n",
       a.name,
       a.email)
}

在剛剛的代碼中,追加一個(gè)*admin作為接受者的方法。

運(yùn)行結(jié)果如下:

Sending user email to john smith<john@yahoo.com>
Sending admin email to john smith<john@yahoo.com>

可以發(fā)現(xiàn)此時(shí)這兩此運(yùn)行的結(jié)果就不一樣了,第二次sendNotification(&ad)調(diào)用的notify方法就是admin這個(gè)類型的了。

這表明,如果外部類型實(shí)現(xiàn)了notify 方法,內(nèi)部類型的實(shí)現(xiàn)就不會(huì)被提升。不過(guò)內(nèi)部類型的值一直存在,因此還可以通過(guò)直接訪問(wèn)內(nèi)部類型的值,來(lái)調(diào)用沒(méi)有被提升的內(nèi)部類型實(shí)現(xiàn)的方法。

三、總結(jié)

綜上:嵌入類型為Go語(yǔ)言類型提供了一種很好的擴(kuò)展能力,通過(guò)內(nèi)部類型的提升,使得外部類型擁有了內(nèi)部類型的方法,也可以通過(guò)外部類型實(shí)現(xiàn)同樣的方法來(lái)替代內(nèi)部類型的??傮w來(lái)說(shuō)很像C#語(yǔ)言中的繼承。

到此這篇關(guān)于Go語(yǔ)言之嵌入類型的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • golang中之strconv包的具體使用方法

    golang中之strconv包的具體使用方法

    這篇文章主要介紹了golang中之strconv包的具體使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Go語(yǔ)言使用Cobra實(shí)現(xiàn)強(qiáng)大命令行應(yīng)用

    Go語(yǔ)言使用Cobra實(shí)現(xiàn)強(qiáng)大命令行應(yīng)用

    Cobra是一個(gè)強(qiáng)大的開(kāi)源工具,能夠幫助我們快速構(gòu)建出優(yōu)雅且功能豐富的命令行應(yīng)用,本文為大家介紹了如何使用Cobra打造強(qiáng)大命令行應(yīng)用,感興趣的小伙伴可以了解一下
    2023-07-07
  • 一文掌握Golang模糊測(cè)試

    一文掌握Golang模糊測(cè)試

    本文主要介紹了一文掌握Golang模糊測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • golang操作mongodb的方法

    golang操作mongodb的方法

    這篇文章主要介紹了golang操作mongodb的方法,涉及Go語(yǔ)言操作mongodb的連接、讀取及顯示的方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • golang?gorm學(xué)習(xí)之如何指定數(shù)據(jù)表

    golang?gorm學(xué)習(xí)之如何指定數(shù)據(jù)表

    在sql中首先要指定是從哪張表中查詢,所以這篇文章小編就來(lái)帶大家一起看一下gorm是如何根據(jù)model來(lái)自動(dòng)解析表名的,感興趣的小伙伴可以了解下
    2023-08-08
  • 基于golang時(shí)間轉(zhuǎn)換的問(wèn)題

    基于golang時(shí)間轉(zhuǎn)換的問(wèn)題

    下面小編就為大家?guī)?lái)一篇基于golang時(shí)間轉(zhuǎn)換的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • golang HTTP 服務(wù)器 處理 日志/Stream流的操作

    golang HTTP 服務(wù)器 處理 日志/Stream流的操作

    這篇文章主要介紹了golang HTTP 服務(wù)器 處理 日志/Stream流的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Golang操作excel的方法

    Golang操作excel的方法

    這篇文章主要介紹了Golang操作excel的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Go語(yǔ)言空白表示符_的實(shí)例用法

    Go語(yǔ)言空白表示符_的實(shí)例用法

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于Go語(yǔ)言空白表示符_的實(shí)例用法,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-07-07
  • Go語(yǔ)言入門教程之Arrays、Slices、Maps、Range操作簡(jiǎn)明總結(jié)

    Go語(yǔ)言入門教程之Arrays、Slices、Maps、Range操作簡(jiǎn)明總結(jié)

    這篇文章主要介紹了Go語(yǔ)言入門教程之Arrays、Slices、Maps、Range操作簡(jiǎn)明總結(jié),本文直接給出操作代碼,同時(shí)對(duì)代碼加上了詳細(xì)注釋,需要的朋友可以參考下
    2014-11-11

最新評(píng)論