人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

Go語言之嵌入類型詳解

發(fā)布日期:2022-07-15 19:48 | 文章來源:腳本之家

一、什么是嵌入類型

先看如下代碼:

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

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

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

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

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

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

運行:

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

①沒有編譯錯誤

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

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

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

接口,只有一個方法notify

type notifier interface {
 notify()
}

函數(shù),接受一個實現(xiàn)notifier接口的類型實例,內(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)
}

運行結(jié)果:

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

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

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

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

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

例如

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

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

運行結(jié)果如下:

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

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

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

三、總結(jié)

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

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

國外服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部