中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Go語言之嵌入類型是什么

發布時間:2022-07-13 10:50:25 來源:億速云 閱讀:157 作者:iii 欄目:開發技術

今天小編給大家分享一下Go語言之嵌入類型是什么的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

一、什么是嵌入類型

先看如下代碼:

type user struct {
    name string
    email string
}

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

可以看到admin結構中的一個成員是user,那么admin中就嵌入了user類型。

  • admin也叫做外部類型

  • user也叫做內部類型

二、外部類型和內部類型之間的關系和機制

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

如上代碼,實現了一個方法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函數中定義了一個變量ad,并且進行了賦值

運行:

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

①沒有編譯錯誤

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

這里涉及到了一個嵌入類型背后的機制,內部類型提升 (感覺有點像C#、Java里面的繼承,user是父類,admin是子類,admin的實例對象直接調用了父類的notify方法。)

進一步研究:我們再定義一個接口、以及一個接受該接口的函數。

接口,只有一個方法notify

type notifier interface {
    notify()
}

函數,接受一個實現notifier接口的類型實例,內部就是調用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)
}

運行結果:

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

①可以看到這里傳入 &user和&ad都是可以的,說明類型提升導致admin也是實現了notifier接口了。

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

Go語言之嵌入類型是什么

Go語言之嵌入類型是什么

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

再進一步研究:我們在C#當中,如果使用了virtual作為修飾符在父類中寫了一個方法,那么在子類中通過override可以重寫這個方法,最終的結果就是調用的非父類的該方法,而是子類的,Go語言同樣可以。

例如

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

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

運行結果如下:

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

可以發現此時這兩此運行的結果就不一樣了,第二次sendNotification(&ad)調用的notify方法就是admin這個類型的了。

這表明,如果外部類型實現了notify 方法,內部類型的實現就不會被提升。不過內部類型的值一直存在,因此還可以通過直接訪問內部類型的值,來調用沒有被提升的內部類型實現的方法。

以上就是“Go語言之嵌入類型是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

繁峙县| 中宁县| 乐昌市| 海阳市| 台中市| 萝北县| 余江县| 游戏| 平阳县| 古田县| 丰镇市| 易门县| 沙河市| 紫金县| 万荣县| 泉州市| 顺平县| 蒙山县| 定西市| 玉溪市| 吉林省| 夏邑县| 丹寨县| 临沭县| 崇左市| 岑溪市| 锦屏县| 射洪县| 桂平市| 偃师市| 隆回县| 利川市| 仙桃市| 嘉荫县| 齐齐哈尔市| 嵊州市| 霍州市| 施甸县| 宁国市| 阿克苏市| 商洛市|