最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言之嵌入類型詳解

 更新時(shí)間:2022年07月12日 16:20:46   作者:奮斗的大橙子  
本文詳細(xì)講解了Go語言之嵌入類型,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(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)部類型提升 (感覺有點(diǎn)像C#、Java里面的繼承,user是父類,admin是子類,admin的實(shí)例對象直接調(diào)用了父類的notify方法。)

進(jìn)一步研究:我們再定義一個(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都是可以的,說明類型提升導(dǎo)致admin也是實(shí)現(xiàn)了notifier接口了。

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

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

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

例如

// 通過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ì)被提升。不過內(nèi)部類型的值一直存在,因此還可以通過直接訪問內(nèi)部類型的值,來調(diào)用沒有被提升的內(nèi)部類型實(shí)現(xiàn)的方法。

三、總結(jié)

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

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

相關(guān)文章

  • 一文帶你掌握Go語言運(yùn)算符的使用

    一文帶你掌握Go語言運(yùn)算符的使用

    運(yùn)算符用于在程序運(yùn)行時(shí)執(zhí)行數(shù)學(xué)或邏輯運(yùn)算。Go 語言內(nèi)置的運(yùn)算符有:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、賦值運(yùn)算符、其他運(yùn)算符。本文將帶大家詳細(xì)了解一下這些運(yùn)算符的使用,感興趣的可以了解一下
    2022-04-04
  • 解決golang內(nèi)存溢出的方法

    解決golang內(nèi)存溢出的方法

    這篇文章主要介紹了解決golang內(nèi)存溢出的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Beego AutoRouter工作原理解析

    Beego AutoRouter工作原理解析

    這篇文章主要為大家介紹了Beego AutoRouter工作原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go語言實(shí)現(xiàn)配置熱加載的方法分享

    Go語言實(shí)現(xiàn)配置熱加載的方法分享

    web項(xiàng)目,經(jīng)常需要熱啟動(dòng)各種各樣的配置信息,一旦這些服務(wù)發(fā)生變更,我們需要重新啟動(dòng)web server,以使配置生效,實(shí)現(xiàn)配置熱加載,本文為大家整理了幾個(gè)方法實(shí)現(xiàn)這個(gè)需求,需要的可以參考下
    2023-05-05
  • 使用Go語言實(shí)現(xiàn)在項(xiàng)目中隱藏敏感信息

    使用Go語言實(shí)現(xiàn)在項(xiàng)目中隱藏敏感信息

    在開發(fā)項(xiàng)目是,用戶信息管理是一個(gè)非常常見的場景,特別是當(dāng)我們需要存儲(chǔ)和處理敏感信息時(shí),本文主要介紹了如何使用Go語言實(shí)現(xiàn)隱藏敏感信息,需要的可以參考下
    2024-11-11
  • go-zero服務(wù)部署配置及源碼解讀

    go-zero服務(wù)部署配置及源碼解讀

    這篇文章主要為大家介紹了go-zero服務(wù)部署配置及源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 淺析Go語言中的方法集合與選擇receiver類型

    淺析Go語言中的方法集合與選擇receiver類型

    這篇文章主要為大家詳細(xì)介紹了Go語言中的方法集合與選擇receiver類型的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們深入學(xué)習(xí)go語言有一定的幫助,需要的可以參考下
    2023-11-11
  • 深入淺出Go語言:手把手教你高效生成與解析JSON數(shù)據(jù)

    深入淺出Go語言:手把手教你高效生成與解析JSON數(shù)據(jù)

    本文將帶你一步步走進(jìn)Go語言的世界,教你如何高效生成與解析JSON數(shù)據(jù),無論你是初學(xué)者還是經(jīng)驗(yàn)豐富的開發(fā)者,都能在本文中找到實(shí)用的技巧和靈感,本文內(nèi)容簡潔明了,示例豐富,讓你在閱讀的過程中輕松掌握Go語言生成與解析JSON數(shù)據(jù)的技巧,需要的朋友可以參考下
    2024-02-02
  • Golang 函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì)裝飾器的一個(gè)實(shí)現(xiàn)詳解

    Golang 函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì)裝飾器的一個(gè)實(shí)現(xiàn)詳解

    這篇文章主要介紹了Golang 函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì)裝飾器的一個(gè)實(shí)現(xiàn)詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • 解決go獲取文件md5值不正確的問題

    解決go獲取文件md5值不正確的問題

    本文主要介紹了解決go獲取文件md5值不正確的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01

最新評論

乌兰察布市| 蓝山县| 康平县| 独山县| 黄山市| 泸西县| 翁牛特旗| 涡阳县| 湖口县| 当雄县| 安泽县| 青冈县| 睢宁县| 曲沃县| 乌兰浩特市| 蕲春县| 余姚市| 潮州市| 简阳市| 定南县| 甘南县| 仙桃市| 开平市| 维西| 田林县| 当阳市| 怀来县| 涡阳县| 鄂温| 措美县| 环江| 杨浦区| 曲阳县| 定州市| 玛纳斯县| 柳林县| 阿勒泰市| 彭泽县| 韶山市| 汉沽区| 巴马|