PHP页面中嵌套go语言,go语言嵌套类型的使用细节
1. 定義
在Go語言中,嵌套類型是將已有的類型直接聲明在新的結構類型里。被嵌入的類型被稱為新的外部類型的內部類型。
通過嵌入類型,與內部類型相關的成員變量會提升到外部類型上。就好像這些成員變量直接聲明在外部類型一樣。如下圖所示:
外部類型可以通過聲明與內部類型成員變量同名的成員變量來覆蓋內部類型的成員變量。如下圖所示:
2. 嵌套類型的基本使用
package main
import "fmt"
// 自定義類型
type userInfo struct {
name string
email string
}
// 自定義類型
type client struct {
userInfo // 嵌入類型
level string
}
// 定義user指針類型調用的方法
func (u *userInfo) notify() {
// 模擬發郵件的功能
fmt.Printf("Send email to %s\n", u.name, u.email)
}
func main() {
// 創建一個client
c := client{
userInfo:userInfo{
name:"lioney",
email:"lioney_liu@sina.com",
},
level: "normal",
}
// 直接訪問內部類型的方法
c.userInfo.notify() // Send email to lioney
// 內部類型的方法也被提升到外部類型
c.notify() // Send email to lioney
}
在以上代碼中,內部類型userInfo的初始化使用結構字面量完成的。通過內部類型的名字userInfo可以訪問內部類型的字段或方法。
對外部類型client來說,內部類型總是存在的。借助內部類型提升,notify方法可以直接通過外部類型的變量c來訪問,實際上所謂的內部類型的提升只是Go編譯器幫我們完成了一次間接查找。
Go編譯器內部對指針進行了優化,c.user.notify()和c.notify()實際上內部執行都是&(c.user).notify(), 因為內部類型的方法是通過指針接收者定義的。
3. 將嵌套類型應用于接口
package main
import "fmt"
// 定義一個通知行為的接口
type notifier interface {
notify()
}
// 定義一個接收接口類型參數的函數
func sendNotification(n notifier) {
n.notify()
}
// 自定義類型
type userInfo struct {
name string
email string
}
// 自定義類型
type client struct {
userInfo // 嵌入類型
level string
}
// 定義user指針類型調用的方法
func (u *userInfo) notify() {
// 模擬發郵件的功能
fmt.Printf("Send email to %s\n", u.name, u.email)
}
func main() {
// 創建一個client
c := client{
userInfo:userInfo{
name:"lioney",
email:"lioney_liu@sina.com",
},
level: "normal",
}
// 實現接口的內部類型的方法,被提升到了外部類型
sendNotification(&c) // Send email to lioney
// 多態調用必須遵守方法集規則
//sendNotification(c) // client does not implement notifier (notify method has pointer receiver)
}
在上面代碼中,由于內部類型的提升,內部類型實現的接口會自動提升到外部類型,可以當成外部類型實現了該接口,我們由此可以實現對外部類型的多態調用。
有一個重要的問題必須指出:在進行多態調用的時候,必須滿足方法集的規則,,方法集定義了接口的參數接收規則,方法集的規則如下表所示:
方法接收者的類型
參數的類型
值
值或指針
指針
指針
由于是內部類型的指針接收者實現了notify方法,所以在多態調用的時候,必須傳入外部類型的地址才能和接口調用相匹配。
4. 內部類型和外部類型實現同一個方法
package main
import "fmt"
// 自定義類型
type userInfo struct {
name string
email string
}
// 自定義類型
type client struct {
userInfo // 嵌入類型
level string
}
// 定義userInfo指針類型調用的方法
func (u *userInfo) notify() {
// 模擬發郵件的功能
fmt.Printf("userInfo notify(), Send email to %s.\n", u.name)
}
// 定義client指針類型調用的方法
func (c *client) notify() {
fmt.Printf("client notify(), Send email to %s.\n", c.name)
}
func main() {
// 創建一個client
c := client{
userInfo:userInfo{
name:"lioney",
email:"lioney_liu@sina.com",
},
level: "normal",
}
// 直接調用
c.notify() // client notify(), Send email to lioney.
// 通過內部類型的變量名調用
c.userInfo.notify() // userInfo notify(), Send email to lioney.
}
從以上代碼可以看出,如果外部類型和內部類型都實現了同一方法notify(),則內部類型的notify()方法不會被提升,但一直存在,可以通過內部類型的變量名來間接調用。
嵌套類型的內容是不是很簡單呢*_*
我是lioney,年輕的后端攻城獅一枚,愛鉆研,愛技術,愛分享。
個人筆記,整理不易,感謝閱讀、點贊和收藏。
文章有任何問題歡迎大家指出,也歡迎大家一起交流后端各種問題!
有疑問加站長微信聯系(非本文作者)
總結
以上是生活随笔為你收集整理的PHP页面中嵌套go语言,go语言嵌套类型的使用细节的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java web逻辑删除代码_MyBat
- 下一篇: 网站html标签如何优化,网站HTML标